2

当我从 Antlr 3 升级到 Antlr 4 时,我删除了语法中的所有句法谓词。但是当我更改它时,我收到了标题中提到的错误。

这是更改后的代码

NUMBER 
    :(
      '0'..'9' ('.' '0'..'9'+)?
    | '.' '0'..'9'+
    )
    (
        E
        (
              M     { $type = EMS;          }
            | X     { $type = EXS;          }
        )
    |   P
        (
              X     
            | T
            | C
        )
                    { $type = LENGTH;       }   
    |   C M         { $type = LENGTH;       }
    |   M
        (
              M     { $type = LENGTH;       }

            | S     { $type = TIME;         }
        )
    |   I N         { $type = LENGTH;       }

    |   D E G       { $type = ANGLE;        }
    |   R A D       { $type = ANGLE;        }

    |   S           { $type = TIME;         }

    |   K? H    Z   { $type = FREQ;         }

    | IDENT         { $type = DIMENSION;    }

    | '%'           { $type = PERCENTAGE;   }

    | // Just a number
    )
;

这是我得到的错误。 在此处输入图像描述

我看到了这个问题的答案here。但我无法理解它的含义。请给我一些指导。

编辑:

语法中出现相同的错误。

    fragment    INVALID :;
     STRING          : '\'' ( ~('\n'|'\r'|'\f'|'\'') )* 
                    (

                            '\''
                            | { $type = INVALID;   }
                    )

                | '"' ( ~('\n'|'\r'|'\f'|'"') )*
                    (
                         '"'
                        | { $type = INVALID;   }
                    )
                ;

我无法将其更改为 ANTLR 4。此代码中有什么新内容?请给我一个快速解决这个问题。

4

1 回答 1

2

您的NUMBER规则已被大量手动左分解。实际上,它是一个生成 9 种不同类型标记的词法分析器规则。由于 ANTLR 3 词法分析器使用递归下降解析器进行预测的方式,可能会执行左分解。ANTLR 4 使用基于 DFA的完全不同的词法分析器算法。您看到的错误是此更改的结果 - 由于 ANTLR 4 词法分析器不再是递归下降分析器,它们不再能够在任意点执行操作代码。

在 ANTLR 4 中编写上述规则最有效的方法是使用 ANTLR 3 中的“低效”语法。在 ANTLR 4 中,它不会很慢。

EMS
    : NUMBER E M
    ;
EXS
    : NUMBER E X
    ;
LENGTH
    : NUMBER P X
    | NUMBER P T
    | NUMBER P C
    | NUMBER C M
    | NUMBER M M
    | NUMBER I N
    ;
TIME
    : NUMBER M S
    | NUMBER S
    ;
ANGLE
    : NUMBER D E G
    | NUMBER R A D
    ;
FREQ
    : NUMBER K? H Z
    ;
DIMENSION
    : NUMBER IDENT
    ;
PERCENTAGE
    : NUMBER '%'
    ;
NUMBER
    : [0-9] ('.' [0-9]+)?
    | '.' [0-9]+
    ;
于 2013-08-27T04:13:24.170 回答