Browse Source

Fix the second parse bug found by oguz-ismail

This one was that bc allowed function definitions after semicolons when
the POSIX grammar technically does not allow it.

Also, this adds missing a missing error message. I found it because I
needed to add yet anothe error message for this bug.

Also, this commit adds the test too.

Signed-off-by: Gavin Howard <gavin@yzena.com>
line_libs
Gavin Howard 7 months ago
parent
commit
9ffdd5ec69
Signed by: gavin
GPG Key ID: C08038BDF280D33E
  1. 4
      include/status.h
  2. 10
      locales/de_DE.ISO8859-1.msg
  3. 10
      locales/de_DE.UTF-8.msg
  4. 10
      locales/en_US.msg
  5. 10
      locales/es_ES.ISO8859-1.msg
  6. 10
      locales/es_ES.UTF-8.msg
  7. 10
      locales/fr_FR.ISO8859-1.msg
  8. 10
      locales/fr_FR.UTF-8.msg
  9. 10
      locales/ja_JP.UTF-8.msg
  10. 10
      locales/ja_JP.eucJP.msg
  11. 10
      locales/nl_NL.ISO8859-1.msg
  12. 10
      locales/nl_NL.UTF-8.msg
  13. 10
      locales/pl_PL.ISO8859-2.msg
  14. 10
      locales/pl_PL.UTF-8.msg
  15. 10
      locales/pt_PT.ISO8859-1.msg
  16. 10
      locales/pt_PT.UTF-8.msg
  17. 10
      locales/ru_RU.CP1251.msg
  18. 10
      locales/ru_RU.CP866.msg
  19. 10
      locales/ru_RU.ISO8859-5.msg
  20. 10
      locales/ru_RU.KOI8-R.msg
  21. 10
      locales/ru_RU.UTF-8.msg
  22. 10
      locales/zh_CN.GB18030.msg
  23. 10
      locales/zh_CN.GB2312.msg
  24. 10
      locales/zh_CN.GBK.msg
  25. 10
      locales/zh_CN.UTF-8.msg
  26. 10
      locales/zh_CN.eucCN.msg
  27. 8
      src/bc_parse.c
  28. 3
      src/data.c
  29. 1
      tests/bc/posix_errors.txt

4
include/status.h

@ -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,

10
locales/de_DE.ISO8859-1.msg

@ -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

10
locales/de_DE.UTF-8.msg

@ -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

10
locales/en_US.msg

@ -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

10
locales/es_ES.ISO8859-1.msg

@ -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

10
locales/es_ES.UTF-8.msg

@ -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

10
locales/fr_FR.ISO8859-1.msg

@ -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

10
locales/fr_FR.UTF-8.msg

@ -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

10
locales/ja_JP.UTF-8.msg

@ -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

10
locales/ja_JP.eucJP.msg

@ -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

10
locales/nl_NL.ISO8859-1.msg

@ -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

10
locales/nl_NL.UTF-8.msg

@ -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

10
locales/pl_PL.ISO8859-2.msg

@ -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

10
locales/pl_PL.UTF-8.msg

@ -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

10
locales/pt_PT.ISO8859-1.msg

@ -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

10
locales/pt_PT.UTF-8.msg

@ -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

10
locales/ru_RU.CP1251.msg

@ -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

10
locales/ru_RU.CP866.msg

@ -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

10
locales/ru_RU.ISO8859-5.msg

@ -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

10
locales/ru_RU.KOI8-R.msg

@ -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

10
locales/ru_RU.UTF-8.msg

@ -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

10
locales/zh_CN.GB18030.msg

@ -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

10
locales/zh_CN.GB2312.msg

@ -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

10
locales/zh_CN.GBK.msg

@ -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

10
locales/zh_CN.UTF-8.msg

@ -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

10
locales/zh_CN.eucCN.msg

@ -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

8
src/bc_parse.c

@ -1759,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) {

3
src/data.c

@ -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

1
tests/bc/posix_errors.txt

@ -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; }

Loading…
Cancel
Save