ANTLR文法からASTをパーサーして生成しようとしています。構造体内の配列と構造体の配列を解析しようとすると、いくつかの問題が発生します。
これは宣言の例です。
TYPE MY_ARRAY :
ARRAY [ 0..2 ] OF INT;
END_TYPE
TYPE est :
STRUCT
c1 : INT;
c : MY_ARRAY;
END_STRUCT;
END_TYPE
TYPE MSA :
ARRAY [ 0..2 ] OF est;
END_TYPE
VAR
MA : MY_ARRAY;
STR : est;
STR2 : MSA;
END_VAR
宣言に問題はありません。次のように式を解析するための文法を書くことができません:
STR.c[1]
STR2[2].c[1]
次のコードは、私のANTLR文法の抜粋を示しています。
operand
: variable_simbolic
| DIRECT_VAR<Localization>
| CTE_INT<ConstantINT>
| CTE_BOOL<ConstantBOOL>
| CTE_REAL<ConstantREAL>
;
variable_simbolic
: (ID -> ID<Identificador>) ( (('[' operand (',' operand)* ']') -> ^(ARRAY_ACCESS<ArrayAccess> ID<Identificador> operand+))
| (('.' operand ) -> ^(FIELD_ACCESS<FieldAccess> ID<Identificador> operand))
| (('#' operand ) -> ^(ENUM_ACCESS<EnumAccess> ID<Identificador> operand))
)?
;
この文法では、STR.c1
またはMA[1]
のような式を解析できますが、のような式は解析されませんSTR.c[1]
。配列アクセスが定義されている場合、それは親式である必要があります。次の図がお役に立てば幸いです。
そのような表現を受け入れるように文法を変更する方法はありますか?前もって感謝します。