私はantlr 2.7.6を使用しています。plc 61131-3 ST 言語のパーサーをプログラミングしていますが、文法の問題を解決できません。
文法は次のとおりです。
case_Stmt : 'CASE' expression 'OF' case_Selection + ( 'ELSE' stmt_List )? 'END_CASE';
case_Selection : case_List ':' stmt_List;
case_List : case_List_Elem ( ',' case_List_Elem )*;
case_List_Elem : subrange | constant_Expr;
constant_Expr : constant | enum_Value;
stmt_List : ( Stmt ? ';' )*;
stmt : assign_Stmt | subprog_Ctrl_Stmt | selection_Stmt | Iteration_Stmt;
assign_Stmt : ( variable ':=' expression )
enum_Value : ( identifier '#' )? identifier;
variable : identifier | ...
この問題は、「enum_Value」が「case_Selection」の場合に発生し、パーサーはそれを新しい「Case_Selection」ではなく、新しい「stmt」として解釈します。例:
CASE (enumVariable) OF
enum#literal1: Variable1 := 1;
enum#liteal2: Variable1 := 2;
enum#liteal3: Variable1 := 3;
ELSE
Variable1 := 4;
END_CASE;
上記の例では、「enum.liteal2」を新しい「case_Selection」として使用する代わりに、「assign_Stmt」と解釈し、「:=」が見つからないためエラーを返します。本当に新しい「stmt」があるかどうかを理解するために、「:」または「:=」が見つかるまで最大文字数を読み取ろうとする方法はありますか?
ありがとうございました!Edit1: より良い構文;