【问题标题】:ANTLR3 - Recognise keywords in any text with spacesANTLR3 - 识别任何带有空格的文本中的关键字
【发布时间】:2014-06-09 21:50:09
【问题描述】:

是否可以在 ANTLR4 中定义一个语法来识别文本中允许使用空格的关键字,例如:

First goal refinedInto Goal two, Goal three
Another goal refinedInto ...

这里的“refinedInto”是一个关键字。到目前为止,我已经提出了以下解析器和词法分析器,但不认为这是解决我的问题的正确方法。即因为我的 REF_LEFT 令牌在上面的示例中评估为“第一个目标提炼的目标”,我想将“第一个目标”与“提炼的目标”关键字分开。

这是我的解析器:

parser grammar GParse;

parse
    : REF_LEFT ( STRING COMMA )* STRING EOF
    ;

这里是词法分析器:

lexer grammar GLex;

REF_LEFT: [a-zA-Z ]+? 'refinedInto ' -> pushMode(RDef);

mode RDef;

STRING : [a-zA-Z ]+;
COMMA  : ',' ' '*;
NL     : ('\n' | EOF) -> popMode;

解决这个问题的正确方法是什么?

【问题讨论】:

    标签: keyword antlr4


    【解决方案1】:

    是的,您可以采取多种不同的方法。最直接的方法是让词法分析器规则将可能的空格作为关键字文字文本的一部分。如果需要,调整以包括标签和新行。

    RDef_To : 'redefinedInto'
            | 'redefined' SPACES 'Into'
            ;
    
    Ws: ( SPACES | TABS ) -> channel(HIDDEN) ;  // should work with 'skip' too
    Term: NLINES ; // if used as the record terminator.
    
    fragment NLINES: ( '\r'? '\n' )+ | '\f'+ ;
    fragment SPACES: ' '+ ;
    fragment TABS:   '\t'+ ;
    

    【讨论】:

    • 问题是我想保留空间。在诸如“第一个目标精炼成第二个目标,...”之类的文本中,我需要识别文本“第一个目标”并触发将其保存到对象中的操作。如果我使用空格,我的目标名称(第一个目标)将不会被保留。目标名称可以是任何字符序列,包括空格,但关键字“refinedInto”除外。
    • @David 您是否将“refinedInto”定义为自己的 Lexer 令牌(例如 REFINED : 'refinedInto' 并在您的 REF_LEFT: [a-zA-Z ]+? REFINED -> pushMode(RDef); 中使用它?那么至少您应该能够在解析结果中识别此令牌.
    猜你喜欢
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多