【问题标题】:ANTLR Parser Rules With String Literals具有字符串文字的 ANTLR 解析器规则
【发布时间】:2011-11-22 18:10:30
【问题描述】:

如果我的解析器规则如下所示:

rule1 : 'functionA' '(' expression-inside-parenthesis ')'; 
expression-inside-parenthesis: ....;

但我从未为“functionA”、“(”和“)”定义任何词法分析器规则。解析器会将这些视为标记吗?对于'('和')',无论如何只有1个字符,我想没有区别。但是对于“functionA”,如果我从未在词法分析器规则中将其定义为标记,那么解析器如何将其视为标记?

【问题讨论】:

    标签: parsing antlr lexer


    【解决方案1】:

    JavaMan 写道:

    解析器如何将其视为令牌?

    ANTLR 在幕后为你创建一个令牌。

    规则:

    rule1 : 'functionA' '(' expression-inside-parenthesis ')';
    // parser rules ...
    // lexer rules  ...
    

    相当于:

    rule1 : FA '(' expression-inside-parenthesis ')';
    // parser rules ...
    FA : 'functionA';
    // lexer rules  ...
    

    如果标记仅包含 1 个字符并且不在其他标记中出现,例如 '('')',则可以在解析器规则中“即时”定义它们,尽快输入您的词法分析器语法还包含类似标识符的标记,最好在词法分析器语法中自己显式定义'functionA' 之类的标记。通过自己明确定义它们,词法分析器尝试标记您的输入的顺序会更清楚。

    编辑

    如果您使用了文字标记并定义了与之匹配的词法分析器规则,如下所示:

    parse : 'functionA' ID;
    FA    : 'functionA';
    ID    : 'a'..'z'+;
    

    然后 ANTLR 将parse 规则解释为:

    parse : FA ID;
    

    【讨论】:

    • 如果我像您的示例一样定义 FA 词法分析器规则,但在我的解析器规则中也使用“functionA”文字会发生什么?现在'functionA'有2个定义,一个是我的FA词法分析器规则,另一个是词法分析器创建的隐式定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多