0

私は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: より良い構文;

4

0 に答える 0