非常に単純なプログラミング言語の BNF 文法を作成し、Flex と Bison を使用してコンパイルしています。
変数と定数の型は、実数、整数、文字列の3 つしかありません。
私の .l ファイルには、次のような「ID」のトークン定義があります。
DIGIT [0-9]
LETTER [a-zA-Z]
ID {LETTER}({LETTER}|{DIGIT})*
私の .y ファイルには、次のような識別子の定義があります。
identifier:
ID;
ここで、識別子の定義を使用して、変数名と定数名を作成します。しかし、同じ型のデータへの代入を制限したい (たとえば、整数変数に文字列を代入したくない)。そこで、各種類の変数と定数を分離するためのいくつかのルールを作成しました。
id_variable_string:
identifier;
id_variable_integer:
identifier;
id_variable_real:
identifier;
定数についても同じことをしました。さて、私の言語では、定数の宣言/定義のセクションと、変数の宣言のセクションがあります。つまり、定数は割り当てと同時に宣言されますが (「myConstant = 123」など)、変数は最初に宣言してから、ステートメント用に特別に設計されたセクションで値を割り当てる必要があります。
たとえば、整数変数と文字列変数が必要な場合は、最初に宣言する必要があります
。STRING myStrVariable;
INTEGER myIntVariable;
次に、ステートメント用に予約されたゾーンで、割り当てを行うことを選択できます (ステートメントは、割り当て、決定、選択、出力などにすることができます)。
assignment:
id_variable_string ASSIGN_OPERATOR literal_string
| id_variable_string ASSIGN_OPERATOR id_const_string
| id_variable_string ASSIGN_OPERATOR id_variable_string
| id_variable_string ASSIGN_OPERATOR concatenacion
| id_variable_integer ASSIGN_OPERATOR id_const_integer
| id_variable_integer ASSIGN_OPERATOR id_variable_integer
| id_variable_integer ASSIGN_OPERATOR expression
| id_variable_integer ASSIGN_OPERATOR literal_integer
| id_variable_real ASSIGN_OPERATOR id_variable_real
| id_variable_real ASSIGN_OPERATOR id_const_real
| id_variable_real ASSIGN_OPERATOR expression
| id_variable_real ASSIGN_OPERATOR literal_real
;
ここで意図しているのは、文字列変数には文字列リテラル、文字列の連結 (+ を使用)、文字列定数、または別の文字列変数のみを割り当てることができるということです。整数変数と実数変数の場合も同じですが、連結ではなく式 (数学演算) を代入することはできません。
連結は次のように定義されます。
concatenation:
id_variable_string ADD_OPERATOR id_variable_string
| id_variable_string ADD_OPERADOR literal_string
| literal_string ADD_OPERADOR id_variable_string
| literal_string ADD_OPERADOR literal_string
| id_const_string ADD_OPERADOR id_const_string
| id_const_string ADD_OPERADOR id_variable_string
| id_const_string ADD_OPERADOR literal_string
| literal_string ADD_OPERADOR id_const_string
| id_variable_string ADD_OPERADOR id_const_string
;
また、式は次のように定義されます。
expression:
expression ADD_OPERATOR term
| expression SUBST_OPERADOR term
| term
;
term:
term MULTIP_OPERATOR factor
| term DIVISION_OPERATOR factor
| factor
;
factor:
id_variable_integer
| id_variable_real
| id_const_integer
| id_const_real
| literal_integer
| literal_real
| PARENTHESIS_OPEN expression PARENTHESIS_CLOSE
;
さて、これはバイソンが言っていることです:
55 代入: id_variable_integer ASSIGN_OPERATOR id_const_integer
56 | id_variable_integer ASSIGN_OPERATOR id_variable_integer
58 | id_variable_integer ASSIGN_OPERATOR リテラル_整数
59 | id_variable_real ASSIGN_OPERATOR id_variable_real
60 | id_variable_real ASSIGN_OPERATOR id_const_real
62 | id_variable_real ASSIGN_OPERATORliteral_real
ステート 50 の競合: 1 シフト/リデュース
ステート 76 の競合: 14 シフト/リデュース
ステート 130 の競合: 2 シフト/リデュース
ステート 131 の競合: 1 シフト/リデュース
ステート 133 の競合: 1 シフト/リデュース
ステート 134 の競合: 1 シフト/リデュース
ステート 135競合: 1 シフト/削減
状態 137 競合: 1 シフト/削減
状態 138 競合: 1 シフト/削減
文法の何かが間違っていると思いますが、正確にはわかりません。