ANTLR——使用谓词插入令牌



我正在努力理解ANTLR谓词。为此,我有一个简单的lexer和解析器,如下所示。

我想做的是,每次看到"foo"后面跟着一些空格,然后是"bar"时,使用谓词插入单词"fubar"。我想做到这一点,同时保持相同的基本结构。在lexer中完成此操作可获得额外积分。如果我能做到这一点而完全不参考底层语言,那我将获得更多的加分。但如果有必要,它是C#。

例如,如果输入字符串为:

programmers use the words foo bar and bar foo class

输出将是

programmers use the words foo fubar bar and bar foo class

Lexer:

lexer grammar TextLexer;
@members
{
    protected const int EOF = Eof;
    protected const int HIDDEN = Hidden;
}
FOO: 'foo';
BAR: 'bar';
TEXT: [a-z]+ ;
WS
    :   ' ' -> channel(HIDDEN)
    ;

分析器:

parser grammar TextParser;
options { tokenVocab=TextLexer; }
@members
{
    protected const int EOF = Eof;
}
file: words EOF;
word:FOO
|BAR
|TEXT;
words: word
| word words
;
compileUnit
    :   EOF
    ;
在这种情况下,ANTLR3的lexer可能需要一个谓词,但ANTLR4的lexer要"聪明"得多。您可以在单个lexer规则中匹配"foo-bar",并使用setText(...):更改其内部文本
FOO_BAR
 : 'foo' [ t]+ 'bar' {setText("fubar");}
 ;
TEXT
 : [a-z]+ 
 ;
WS
 : ' ' -> channel(HIDDEN)
 ;

相关内容

  • 没有找到相关文章

最新更新