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”时,解析器将其解释为新的“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:更好的语法;

4

0 回答 0