我正在使用 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”时,解析器将其解释为新的“stmt”而不是它应该的新“Case_Selection”。例子:
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:更好的语法;