vendor/bc: import release 5.2.1

This release fixes two parse bugs when in POSIX standard mode. One of
these bugs was due to a quirk of the POSIX grammar, and the other was
because bc was too strict.
This commit is contained in:
Stefan Eßer 2021-11-30 18:33:40 +01:00
parent 23aff12408
commit e63540eed2
35 changed files with 206 additions and 104 deletions

View file

@ -1,5 +1,11 @@
# News
## 5.2.1
This is a production release that fixes two parse bugs when in POSIX standard
mode. One of these bugs was due to a quirk of the POSIX grammar, and the other
was because `bc` was too strict.
## 5.2.0
This is a production release that adds a new feature, fixes some bugs, and adds

View file

@ -52,13 +52,15 @@ usage() {
printf 'usage:\n'
printf ' %s -h\n' "$script"
printf ' %s --help\n' "$script"
printf ' %s [-a|-bD|-dB|-c] [-CEfgGHlmMNPtTvz] [-O OPT_LEVEL] [-k KARATSUBA_LEN]\n' "$script"
printf ' %s [-a|-bD|-dB|-c] [-CEfgGHlmMNtTvz] [-O OPT_LEVEL] [-k KARATSUBA_LEN]\\\n' "$script"
printf ' [-s SETTING] [-S SETTING]\n'
printf ' %s \\\n' "$script"
printf ' [--library|--bc-only --disable-dc|--dc-only --disable-bc|--coverage] \\\n'
printf ' [--force --debug --disable-extra-math --disable-generated-tests] \\\n'
printf ' [--disable-history --disable-man-pages --disable-nls --disable-strip] \\\n'
printf ' [--install-all-locales] [--opt=OPT_LEVEL] \\\n'
printf ' [--karatsuba-len=KARATSUBA_LEN] \\\n'
printf ' [--set-default-on=SETTING] [--set-default-off=SETTING] \\\n'
printf ' [--prefix=PREFIX] [--bindir=BINDIR] [--datarootdir=DATAROOTDIR] \\\n'
printf ' [--datadir=DATADIR] [--mandir=MANDIR] [--man1dir=MAN1DIR] \\\n'
printf '\n'

View file

@ -480,6 +480,10 @@ typedef enum BcErr {
/// Empty statements in POSIX for loop error.
BC_ERR_POSIX_FOR,
/// POSIX's grammar does not allow a function definition right after a
/// semicolon.
BC_ERR_POSIX_FUNC_AFTER_SEMICOLON,
/// Non-POSIX exponential (scientific or engineering) number used error.
BC_ERR_POSIX_EXP_NUM,

View file

@ -37,6 +37,6 @@
#define BC_VERSION_H
/// The current version.
#define VERSION 5.2.0
#define VERSION 5.2.1
#endif // BC_VERSION_H

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX erlaubt keine Vergleichsoperatoren außerhalb von if-Anweisungen oder Schleifen"
23 "POSIX benötigt 0 oder 1 Vergleichsoperatoren pro Bedingung"
24 "POSIX erlaubt keinen leeren Ausdruck in einer for-Schleife"
25 "POSIX erlaubt keine exponentielle Notation"
26 "POSIX erlaubt keine Feld-Referenzen als Funktionsparameter"
27 "POSIX erfordert, dass die linke Klammer auf der gleichen Linie wie der Funktionskopf steht"
28 "POSIX erlaubt keine Zuweisung von Strings an Variablen oder Arrays"
25 "POSIX verlangt einen Zeilenumbruch zwischen einem Semikolon und einer Funktionsdefinition"
26 "POSIX erlaubt keine exponentielle Notation"
27 "POSIX erlaubt keine Feld-Referenzen als Funktionsparameter"
28 "POSIX erlaubt keine ungültigen Funktionen"
29 "POSIX erfordert, dass die linke Klammer auf der gleichen Linie wie der Funktionskopf steht"
30 "POSIX erlaubt keine Zuweisung von Strings an Variablen oder Arrays"
$ Runtime errors.
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX erlaubt keine Vergleichsoperatoren außerhalb von if-Anweisungen oder Schleifen"
23 "POSIX benötigt 0 oder 1 Vergleichsoperatoren pro Bedingung"
24 "POSIX erlaubt keinen leeren Ausdruck in einer for-Schleife"
25 "POSIX erlaubt keine exponentielle Notation"
26 "POSIX erlaubt keine Feld-Referenzen als Funktionsparameter"
27 "POSIX erfordert, dass die linke Klammer auf der gleichen Linie wie der Funktionskopf steht"
28 "POSIX erlaubt keine Zuweisung von Strings an Variablen oder Arrays"
25 "POSIX verlangt einen Zeilenumbruch zwischen einem Semikolon und einer Funktionsdefinition"
26 "POSIX erlaubt keine exponentielle Notation"
27 "POSIX erlaubt keine Feld-Referenzen als Funktionsparameter"
28 "POSIX erlaubt keine ungültigen Funktionen"
29 "POSIX erfordert, dass die linke Klammer auf der gleichen Linie wie der Funktionskopf steht"
30 "POSIX erlaubt keine Zuweisung von Strings an Variablen oder Arrays"
$ Runtime errors.
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX does not allow comparison operators outside if statements or loops"
23 "POSIX requires 0 or 1 comparison operators per condition"
24 "POSIX requires all 3 parts of a for loop to be non-empty"
25 "POSIX does not allow exponential notation"
26 "POSIX does not allow array references as function parameters"
27 "POSIX requires the left brace be on the same line as the function header"
28 "POSIX does not allow strings to be assigned to variables or arrays"
25 "POSIX requires a newline between a semicolon and a function definition",
26 "POSIX does not allow exponential notation"
27 "POSIX does not allow array references as function parameters"
28 "POSIX does not allow void functions",
29 "POSIX requires the left brace be on the same line as the function header"
30 "POSIX does not allow strings to be assigned to variables or arrays"
$ Runtime errors.
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX no permite operadores de comparación aparte de \"if\" expresión o bucles"
23 "POSIX requiere 0 o 1 operadores de comparisón para cada condición"
24 "POSIX requiere todos 3 partes de una bucla que no esta vacío"
25 "POSIX no permite una notación exponencial"
26 "POSIX no permite una referencia a una matriz como un parámetro de función"
27 "POSIX requiere el llave de la izquierda que sea en la misma línea que los parámetros de la función"
28 "POSIX no permite asignar cadenas a variables o matrices"
25 "POSIX requiere una nueva línea entre un punto y coma y una definición de función"
26 "POSIX no permite una notación exponencial"
27 "POSIX no permite una referencia a una matriz como un parámetro de función"
28 "POSIX no permite funciones void"
29 "POSIX requiere el llave de la izquierda que sea en la misma línea que los parámetros de la función"
30 "POSIX no permite asignar cadenas a variables o matrices"
$ Runtime errors.
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX no permite operadores de comparación aparte de \"if\" expresión o bucles"
23 "POSIX requiere 0 o 1 operadores de comparisón para cada condición"
24 "POSIX requiere todos 3 partes de una bucla que no esta vacío"
25 "POSIX no permite una notación exponencial"
26 "POSIX no permite una referencia a una matriz como un parámetro de función"
27 "POSIX requiere el llave de la izquierda que sea en la misma línea que los parámetros de la función"
28 "POSIX no permite asignar cadenas a variables o matrices"
25 "POSIX requiere una nueva línea entre un punto y coma y una definición de función"
26 "POSIX no permite una notación exponencial"
27 "POSIX no permite una referencia a una matriz como un parámetro de función"
28 "POSIX no permite funciones void"
29 "POSIX requiere el llave de la izquierda que sea en la misma línea que los parámetros de la función"
30 "POSIX no permite asignar cadenas a variables o matrices"
$ Runtime errors.
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX interdit les opérateurs de comparaison en dehors des expressions 'if' ou des boucles"
23 "POSIX impose 0 ou 1 opérateur de comparaison par condition"
24 "POSIX interdit une expression vide dans une boucle 'for'"
25 "POSIX interdit la notation exponentielle"
26 "POSIX interdit les références à un tableau dans les paramètres d'une fonction"
27 "POSIX impose que l'en-tête de la fonction et le '{' soient sur la même ligne"
28 "POSIX interdit pas d'assigner des chaînes de caractères à des variables ou à des tableaux"
25 "POSIX exige une nouvelle ligne entre un point-virgule et une définition de fonction"
26 "POSIX interdit la notation exponentielle"
27 "POSIX interdit les références à un tableau dans les paramètres d'une fonction"
28 "POSIX n'autorise pas les fonctions void"
29 "POSIX impose que l'en-tête de la fonction et le '{' soient sur la même ligne"
30 "POSIX interdit pas d'assigner des chaînes de caractères à des variables ou à des tableaux"
$ Runtime errors.
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX interdit les opérateurs de comparaison en dehors des expressions 'if' ou des boucles"
23 "POSIX impose 0 ou 1 opérateur de comparaison par condition"
24 "POSIX interdit une expression vide dans une boucle 'for'"
25 "POSIX interdit la notation exponentielle"
26 "POSIX interdit les références à un tableau dans les paramètres d'une fonction"
27 "POSIX impose que l'en-tête de la fonction et le '{' soient sur la même ligne"
28 "POSIX interdit pas d'assigner des chaînes de caractères à des variables ou à des tableaux"
25 "POSIX exige une nouvelle ligne entre un point-virgule et une définition de fonction."
26 "POSIX interdit la notation exponentielle"
27 "POSIX interdit les références à un tableau dans les paramètres d'une fonction"
28 "POSIX n'autorise pas les fonctions void"
29 "POSIX impose que l'en-tête de la fonction et le '{' soient sur la même ligne"
30 "POSIX interdit pas d'assigner des chaînes de caractères à des variables ou à des tableaux"
$ Runtime errors.
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX は if 文やループの外の比較演算子を許可しません。"
23 "POSIXは条件ごとに0または1の比較演算子を必要とします。"
24 "POSIXはforループの3つの部分がすべて空でないことを要求します。"
25 "POSIXは指数表記を許可しません。"
26 "POSIX は関数パラメータとして配列参照を許可しません。"
27 "POSIXでは、関数ヘッダと同じ行に左中括弧があることが必要です。"
28 "POSIXでは、変数や配列に文字列を割り当てることはできません。"
25 "POSIXでは、セミコロンと関数定義の間に改行を入れる必要があります。"
26 "POSIXは指数表記を許可しません。"
27 "POSIX は関数パラメータとして配列参照を許可しません。"
28 "POSIXではvoid関数を認めていません。"
29 "POSIXでは、関数ヘッダと同じ行に左中括弧があることが必要です。"
30 "POSIXでは、変数や配列に文字列を割り当てることはできません。"
$ ランタイムエラー。
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX は if 文やループの外の比較演算子を許可しません。"
23 "POSIXは条件ごとに0または1の比較演算子を必要とします。"
24 "POSIXはforループの3つの部分がすべて空でないことを要求します。"
25 "POSIXは指数表記を許可しません。"
26 "POSIX は関数パラメータとして配列参照を許可しません。"
27 "POSIXでは、関数ヘッダと同じ行に左中括弧があることが必要です。"
28 "POSIXでは、変数や配列に文字列を割り当てることはできません。"
25 "POSIXでは、セミコロンと関数定義の間に改行を入れる必要があります。"
26 "POSIXは指数表記を許可しません。"
27 "POSIX は関数パラメータとして配列参照を許可しません。"
28 "POSIXではvoid関数を認めていません。"
29 "POSIXでは、関数ヘッダと同じ行に左中括弧があることが必要です。"
30 "POSIXでは、変数や配列に文字列を割り当てることはできません。"
$ ランタイムエラー。
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX laat geen vergelijking toe tussen operatoren buiten als verklaringen of lussen"
23 "POSIX vereist 0 of 1 vergelijkingsoperator per conditie"
24 "POSIX vereist dat alle 3 de delen van een lus niet leeg zijn"
25 "POSIX laat geen exponentiële notatie toe"
26 "POSIX staat geen arrayreferenties toe als functieparameters"
27 "POSIX vereist dat de linkse beugel op dezelfde regel staat als de functiehoofding"
28 "POSIX staat niet toe dat strings worden toegewezen aan variabelen of arrays"
25 "POSIX vereist een nieuwe regel tussen een puntkomma en een functiedefinitie"
26 "POSIX laat geen exponentiële notatie toe"
27 "POSIX staat geen arrayreferenties toe als functieparameters"
28 "POSIX staat geen lege functies toe"
29 "POSIX vereist dat de linkse beugel op dezelfde regel staat als de functiehoofding"
30 "POSIX staat niet toe dat strings worden toegewezen aan variabelen of arrays"
$ Runtime fouten.
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX laat geen vergelijking toe tussen operatoren buiten als verklaringen of lussen"
23 "POSIX vereist 0 of 1 vergelijkingsoperator per conditie"
24 "POSIX vereist dat alle 3 de delen van een lus niet leeg zijn"
25 "POSIX laat geen exponentiële notatie toe"
26 "POSIX staat geen arrayreferenties toe als functieparameters"
27 "POSIX vereist dat de linkse beugel op dezelfde regel staat als de functiehoofding"
28 "POSIX staat niet toe dat strings worden toegewezen aan variabelen of arrays"
25 "POSIX vereist een nieuwe regel tussen een puntkomma en een functiedefinitie"
26 "POSIX laat geen exponentiële notatie toe"
27 "POSIX staat geen arrayreferenties toe als functieparameters"
28 "POSIX staat geen lege functies toe"
29 "POSIX vereist dat de linkse beugel op dezelfde regel staat als de functiehoofding"
30 "POSIX staat niet toe dat strings worden toegewezen aan variabelen of arrays"
$ Runtime fouten.
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX nie pozwala na porównywanie operatorów na zewnątrz, jeśli deklaracje lub pętle"
23 "POSIX wymaga 0 lub 1 operatora porównawczego na jeden warunek"
24 "POSIX wymaga, aby wszystkie 3 części pętli nie były puste"
25 "POSIX nie pozwala na notację wykładniczą"
26 "POSIX nie zezwala na odniesienia do tablicy jako parametrów funkcji"
27 "POSIX wymaga, aby lewe usztywnienie znajdowało się na tej samej linii co nagłówek funkcji"
28 "POSIX nie pozwala na przypisywanie ciągów znaków do zmiennych lub tablic"
25 "POSIX wymaga nowej linii pomiędzy średnikiem a definicją funkcji"
26 "POSIX nie pozwala na notację wykładniczą"
27 "POSIX nie zezwala na odniesienia do tablicy jako parametrów funkcji"
28 "POSIX nie dopuszcza funkcji void"
29 "POSIX wymaga, aby lewe usztywnienie znajdowało się na tej samej linii co nagłówek funkcji"
30 "POSIX nie pozwala na przypisywanie ciągów znaków do zmiennych lub tablic"
$ Błędy Runtime'u.
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX nie pozwala na porównywanie operatorów na zewnątrz, jeśli deklaracje lub pętle"
23 "POSIX wymaga 0 lub 1 operatora porównawczego na jeden warunek"
24 "POSIX wymaga, aby wszystkie 3 części pętli nie były puste"
25 "POSIX nie pozwala na notację wykładniczą"
26 "POSIX nie zezwala na odniesienia do tablicy jako parametrów funkcji"
27 "POSIX wymaga, aby lewe usztywnienie znajdowało się na tej samej linii co nagłówek funkcji"
28 "POSIX nie pozwala na przypisywanie ciągów znaków do zmiennych lub tablic"
25 "POSIX wymaga nowej linii pomiędzy średnikiem a definicją funkcji"
26 "POSIX nie pozwala na notację wykładniczą"
27 "POSIX nie zezwala na odniesienia do tablicy jako parametrów funkcji"
28 "POSIX nie dopuszcza funkcji void"
29 "POSIX wymaga, aby lewe usztywnienie znajdowało się na tej samej linii co nagłówek funkcji"
30 "POSIX nie pozwala na przypisywanie ciągów znaków do zmiennych lub tablic"
$ Błędy Runtime'u.
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX não permite operadores de comparação fora das expressões 'if' ou loops"
23 "POSIX requer operadores 0 ou 1 de comparação por condição"
24 "POSIX não permite uma expressão vazia em um loop 'for'"
25 "POSIX não permite notação exponencial"
26 "POSIX não permite referências de matriz como parâmetros de função"
27 "POSIX requer que o cabeçalho da função '{' estejam na mesma linha"
28 "POSIX não permite a atribuição de cadeias de caracteres a variáveis ou matrizes"
25 "POSIX requer uma nova linha entre um ponto-e-vírgula e uma definição de função"
26 "POSIX não permite notação exponencial"
27 "POSIX não permite referências de matriz como parâmetros de função"
28 "POSIX não permite funções nulas"
29 "POSIX requer que o cabeçalho da função '{' estejam na mesma linha"
30 "POSIX não permite a atribuição de cadeias de caracteres a variáveis ou matrizes"
$ Runtime errors.
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX não permite operadores de comparação fora das expressões 'if' ou loops"
23 "POSIX requer operadores 0 ou 1 de comparação por condição"
24 "POSIX não permite uma expressão vazia em um loop 'for'"
25 "POSIX não permite notação exponencial"
26 "POSIX não permite referências de matriz como parâmetros de função"
27 "POSIX requer que o cabeçalho da função '{' estejam na mesma linha"
28 "POSIX não permite a atribuição de cadeias de caracteres a variáveis ou matrizes"
25 "POSIX requer uma nova linha entre um ponto-e-vírgula e uma definição de função"
26 "POSIX não permite notação exponencial"
27 "POSIX não permite referências de matriz como parâmetros de função"
28 "POSIX não permite funções nulas"
29 "POSIX requer que o cabeçalho da função '{' estejam na mesma linha"
30 "POSIX não permite a atribuição de cadeias de caracteres a variáveis ou matrizes"
$ Runtime errors.
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX не разрешает операторам сравнения выходить за пределы, если утверждения или циклы"
23 "POSIX требует 0 или 1 оператора сравнения на условие"
24 "POSIX требует, чтобы все 3 части петли были непустыми"
25 "POSIX не допускает экспоненциальной нотации"
26 "POSIX не допускает ссылки на массив в качестве параметров функции"
27 "POSIX требует, чтобы левая скобка была на той же линии, что и заголовок функции"
28 "POSIX не позволяет присваивать строки переменным или массивам"
25 "POSIX требует наличия новой строки между точкой с запятой и определением функции"
26 "POSIX не допускает экспоненциальной нотации"
27 "POSIX не допускает ссылки на массив в качестве параметров функции"
28 "POSIX не разрешает функции пустоты"
29 "POSIX требует, чтобы левая скобка была на той же линии, что и заголовок функции"
30 "POSIX не позволяет присваивать строки переменным или массивам"
$ Ошибки выполнения.
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX ­¥ à §à¥è ¥â ®¯¥à â®à ¬ áà ¢­¥­¨ï ¢ë室¨âì §  ¯à¥¤¥«ë, ¥á«¨ ã⢥ত¥­¨ï ¨«¨ 横«ë"
23 "POSIX âॡã¥â 0 ¨«¨ 1 ®¯¥à â®à  áà ¢­¥­¨ï ­  ãá«®¢¨¥"
24 "POSIX âॡã¥â, çâ®¡ë ¢á¥ 3 ç á⨠¯¥â«¨ ¡ë«¨ ­¥¯ãáâ묨"
25 "POSIX ­¥ ¤®¯ã᪠¥â íªá¯®­¥­æ¨ «ì­®© ­®â æ¨¨"
26 "POSIX ­¥ ¤®¯ã᪠¥â áá뫪¨ ­  ¬ áᨢ ¢ ª ç¥á⢥ ¯ à ¬¥â஢ ä㭪樨"
27 "POSIX âॡã¥â, çâ®¡ë «¥¢ ï ᪮¡ª  ¡ë«  ­  ⮩ ¦¥ «¨­¨¨, çâ® ¨ § £®«®¢®ª ä㭪樨"
28 "POSIX ­¥ ¯®§¢®«ï¥â ¯à¨á¢ ¨¢ âì áâப¨ ¯¥à¥¬¥­­ë¬ ¨«¨ ¬ áᨢ ¬"
25 "POSIX âॡã¥â ­ «¨ç¨ï ­®¢®© áâப¨ ¬¥¦¤ã â®çª®© á § ¯ï⮩ ¨ ®¯à¥¤¥«¥­¨¥¬ ä㭪樨"
26 "POSIX ­¥ ¤®¯ã᪠¥â íªá¯®­¥­æ¨ «ì­®© ­®â æ¨¨"
27 "POSIX ­¥ ¤®¯ã᪠¥â áá뫪¨ ­  ¬ áᨢ ¢ ª ç¥á⢥ ¯ à ¬¥â஢ ä㭪樨"
28 "POSIX ­¥ à §à¥è ¥â ä㭪樨 ¯ãáâ®âë"
29 "POSIX âॡã¥â, çâ®¡ë «¥¢ ï ᪮¡ª  ¡ë«  ­  ⮩ ¦¥ «¨­¨¨, çâ® ¨ § £®«®¢®ª ä㭪樨"
30 "POSIX ­¥ ¯®§¢®«ï¥â ¯à¨á¢ ¨¢ âì áâப¨ ¯¥à¥¬¥­­ë¬ ¨«¨ ¬ áᨢ ¬"
$ Žè¨¡ª¨ ¢ë¯®«­¥­¨ï.
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX не разрешает операторам сравнения выходить за пределы, если утверждения или циклы"
23 "POSIX требует 0 или 1 оператора сравнения на условие"
24 "POSIX требует, чтобы все 3 части петли были непустыми"
25 "POSIX не допускает экспоненциальной нотации"
26 "POSIX не допускает ссылки на массив в качестве параметров функции"
27 "POSIX требует, чтобы левая скобка была на той же линии, что и заголовок функции"
28 "POSIX не позволяет присваивать строки переменным или массивам"
25 "POSIX требует наличия новой строки между точкой с запятой и определением функции"
26 "POSIX не допускает экспоненциальной нотации"
27 "POSIX не допускает ссылки на массив в качестве параметров функции"
28 "POSIX не разрешает функции пустоты"
29 "POSIX требует, чтобы левая скобка была на той же линии, что и заголовок функции"
30 "POSIX не позволяет присваивать строки переменным или массивам"
$ Ошибки выполнения.
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX не разрешает операторам сравнения выходить за пределы, если утверждения или циклы"
23 "POSIX требует 0 или 1 оператора сравнения на условие"
24 "POSIX требует, чтобы все 3 части петли были непустыми"
25 "POSIX не допускает экспоненциальной нотации"
26 "POSIX не допускает ссылки на массив в качестве параметров функции"
27 "POSIX требует, чтобы левая скобка была на той же линии, что и заголовок функции"
28 "POSIX не позволяет присваивать строки переменным или массивам"
25 "POSIX требует наличия новой строки между точкой с запятой и определением функции"
26 "POSIX не допускает экспоненциальной нотации"
27 "POSIX не допускает ссылки на массив в качестве параметров функции"
28 "POSIX не разрешает функции пустоты"
29 "POSIX требует, чтобы левая скобка была на той же линии, что и заголовок функции"
30 "POSIX не позволяет присваивать строки переменным или массивам"
$ Ошибки выполнения.
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX не разрешает операторам сравнения выходить за пределы, если утверждения или циклы"
23 "POSIX требует 0 или 1 оператора сравнения на условие"
24 "POSIX требует, чтобы все 3 части петли были непустыми"
25 "POSIX не допускает экспоненциальной нотации"
26 "POSIX не допускает ссылки на массив в качестве параметров функции"
27 "POSIX требует, чтобы левая скобка была на той же линии, что и заголовок функции"
28 "POSIX не позволяет присваивать строки переменным или массивам"
25 "POSIX требует наличия новой строки между точкой с запятой и определением функции"
26 "POSIX не допускает экспоненциальной нотации"
27 "POSIX не допускает ссылки на массив в качестве параметров функции"
28 "POSIX не разрешает функции пустоты"
29 "POSIX требует, чтобы левая скобка была на той же линии, что и заголовок функции"
30 "POSIX не позволяет присваивать строки переменным или массивам"
$ Ошибки выполнения.
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX不允许在if语句或循环之外的比较运算符"
23 "POSIX要求每个条件的比较运算符为0或1个"
24 "POSIX要求for循环的所有3个部分必须是非空的"
25 "POSIX不允许使用指数符号"
26 "POSIX不允许数组引用作为函数参数"
27 "POSIX要求左边的括号和函数头在同一行上"
28 "POSIX不允许将字符串分配给变量或数组"
25 "POSIX要求在分号和函数定义之间使用换行符"
26 "POSIX不允许使用指数符号"
27 "POSIX不允许数组引用作为函数参数"
28 "POSIX不允许无效函数"
29 "POSIX要求左边的括号和函数头在同一行上"
30 "POSIX不允许将字符串分配给变量或数组"
$ 运行时错误。
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX不允许在if语句或循环之外的比较运算符"
23 "POSIX要求每个条件的比较运算符为0或1个"
24 "POSIX要求for循环的所有3个部分必须是非空的"
25 "POSIX不允许使用指数符号"
26 "POSIX不允许数组引用作为函数参数"
27 "POSIX要求左边的括号和函数头在同一行上"
28 "POSIX不允许将字符串分配给变量或数组"
25 "POSIX要求在分号和函数定义之间使用换行符"
26 "POSIX不允许使用指数符号"
27 "POSIX不允许数组引用作为函数参数"
28 "POSIX不允许无效函数"
29 "POSIX要求左边的括号和函数头在同一行上"
30 "POSIX不允许将字符串分配给变量或数组"
$ 运行时错误。
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX不允许在if语句或循环之外的比较运算符"
23 "POSIX要求每个条件的比较运算符为0或1个"
24 "POSIX要求for循环的所有3个部分必须是非空的"
25 "POSIX不允许使用指数符号"
26 "POSIX不允许数组引用作为函数参数"
27 "POSIX要求左边的括号和函数头在同一行上"
28 "POSIX不允许将字符串分配给变量或数组"
25 "POSIX要求在分号和函数定义之间使用换行符"
26 "POSIX不允许使用指数符号"
27 "POSIX不允许数组引用作为函数参数"
28 "POSIX不允许无效函数"
29 "POSIX要求左边的括号和函数头在同一行上"
30 "POSIX不允许将字符串分配给变量或数组"
$ 运行时错误。
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX不允许在if语句或循环之外的比较运算符"
23 "POSIX要求每个条件的比较运算符为0或1个"
24 "POSIX要求for循环的所有3个部分必须是非空的"
25 "POSIX不允许使用指数符号"
26 "POSIX不允许数组引用作为函数参数"
27 "POSIX要求左边的括号和函数头在同一行上"
28 "POSIX不允许将字符串分配给变量或数组"
25 "POSIX要求在分号和函数定义之间使用换行符"
26 "POSIX不允许使用指数符号"
27 "POSIX不允许数组引用作为函数参数"
28 "POSIX不允许无效函数"
29 "POSIX要求左边的括号和函数头在同一行上"
30 "POSIX不允许将字符串分配给变量或数组"
$ 运行时错误。
$set 5

View file

@ -77,10 +77,12 @@ $set 4
22 "POSIX不允许在if语句或循环之外的比较运算符"
23 "POSIX要求每个条件的比较运算符为0或1个"
24 "POSIX要求for循环的所有3个部分必须是非空的"
25 "POSIX不允许使用指数符号"
26 "POSIX不允许数组引用作为函数参数"
27 "POSIX要求左边的括号和函数头在同一行上"
28 "POSIX不允许将字符串分配给变量或数组"
25 "POSIX要求在分号和函数定义之间使用换行符"
26 "POSIX不允许使用指数符号"
27 "POSIX不允许数组引用作为函数参数"
28 "POSIX不允许无效函数"
29 "POSIX要求左边的括号和函数头在同一行上"
30 "POSIX不允许将字符串分配给变量或数组"
$ 运行时错误。
$set 5

View file

@ -79,6 +79,7 @@ static bool bc_parse_inst_isLeaf(BcInst t) {
* that can legally end a statement. In bc's case, it could be a newline, a
* semicolon, and a brace in certain cases.
* @param p The parser.
* @return True if the token is a legal delimiter.
*/
static bool bc_parse_isDelimiter(const BcParse *p) {
@ -127,6 +128,23 @@ static bool bc_parse_isDelimiter(const BcParse *p) {
return good;
}
/**
* Returns true if we are in top level of a function body. The POSIX grammar
* is defined such that anything is allowed after a function body, so we must
* use this function to detect that case when ending a function body.
* @param p The parser.
* @return True if we are in the top level of parsing a function body.
*/
static bool bc_parse_TopFunc(const BcParse *p) {
bool good = p->flags.len == 2;
uint16_t val = BC_PARSE_FLAG_BRACE | BC_PARSE_FLAG_FUNC_INNER;
val |= BC_PARSE_FLAG_FUNC;
return good && BC_PARSE_TOP_FLAG(p) == val;
}
/**
* Sets a previously defined exit label. What are labels? See the bc Parsing
* section of the Development manual (manuals/development.md).
@ -881,7 +899,7 @@ static void bc_parse_endBody(BcParse *p, bool brace) {
bc_lex_next(&p->l);
// If the next token is not a delimiter, that is a problem.
if (BC_ERR(!bc_parse_isDelimiter(p)))
if (BC_ERR(!bc_parse_isDelimiter(p) && !bc_parse_TopFunc(p)))
bc_parse_err(p, BC_ERR_PARSE_TOKEN);
}
@ -1741,6 +1759,14 @@ static void bc_parse_stmt(BcParse *p) {
// Make sure semicolons are eaten.
while (p->l.t == BC_LEX_SCOLON) bc_lex_next(&p->l);
// POSIX's grammar does not allow a function definition after a semicolon
// without a newline, so check specifically for that case and error if
// the POSIX standard flag is set.
if (p->l.last == BC_LEX_SCOLON && p->l.t == BC_LEX_KW_DEFINE && BC_IS_POSIX)
{
bc_parse_err(p, BC_ERR_POSIX_FUNC_AFTER_SEMICOLON);
}
}
void bc_parse_parse(BcParse *p) {

View file

@ -202,7 +202,7 @@ const uchar bc_err_ids[] = {
BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
#endif // BC_ENABLED
};
@ -273,6 +273,7 @@ const char* const bc_err_msgs[] = {
"POSIX does not allow comparison operators outside if statements or loops",
"POSIX requires 0 or 1 comparison operators per condition",
"POSIX requires all 3 parts of a for loop to be non-empty",
"POSIX requires a newline between a semicolon and a function definition",
#if BC_ENABLE_EXTRA_MATH
"POSIX does not allow exponential notation",
#else

View file

@ -43,6 +43,7 @@ misc4
misc5
misc6
misc7
misc8
void
rand
recursive_arrays

8
tests/bc/misc8.txt Normal file
View file

@ -0,0 +1,8 @@
define a(){
return 5
}define b(){
return 6
}
24
a()
b()

View file

@ -0,0 +1,3 @@
24
5
6

View file

@ -7,6 +7,7 @@ halt
define x(e) { return 0; }
define x(e) { return 4*(e+e); }
define x(e) { return (e+e)*4; }
define a() { return (5); };define b() { return (6); }
limits
.
if (q!=0) { x=3; } else { x=4; }