可以为词法分析器定义自定义参数吗?

时间:2019-06-20 09:32:31

标签: antlr4

例如,我在语法中定义了几个词法分析器规则:

INT: 'int';
FLOAT: 'float';
...

DIGIT : [0-9];
NUMERIC : (DIGIT+ | DIGIT+ '.' DIGIT+ | '.' DIGIT+ | DIGIT+ '.');
...

我需要以某种方式标记关键字('int','float'等),以便当我使用TokenStream获得令牌时,可以通过一些自定义符号对其进行过滤。

有可能吗?

现在,我只看到一种方法-将必要的词法分析器组合成某种规则。

更新

我尝试应用下面第一个答案的第一个选项,但遇到下一个问题: 我收到错误消息:“ TOKENNAME不是公认的令牌名称”

在这种情况下是issue。 我从这里应用建议:

使用

options { tokenVocab = MyLexer; }

代替

import MyLexer;

并得到错误:'错误(114):MyParser.g4:3:23:无法找到令牌文件。\ MyLexer.tokens'

Here说,据我所知,当ANTLR源文件(MyParser.g4,MyLexer.g4)放置在与生成包相同的目录中时,可能会发生这种情况。但是我将输出文件的属性设置为另一个目录。 也许我有点不理解...

Here是一个小例子。

1 个答案:

答案 0 :(得分:0)

根据您使用词法分析器的其他用途,您可以探索2种途径。

  1. 使用type()词法分析器命令来重新映射令牌。

    从那里的文档中获取示例:

    lexer grammar SetType;
    tokens { STRING }
    DOUBLE : '"' .*? '"'   -> type(STRING) ;
    SINGLE : '\'' .*? '\'' -> type(STRING) ;
    WS     : [ \r\t\n]+    -> skip ;
    

    这将允许针对单一类型STRING(您将在流中收到的令牌类型)使用多个规则。

  2. 具有令牌流的channel()命令可用于标记和过滤令牌。如果您以后仍需要解析,这样做的好处是保留了原始词法分析器流。

    再次,从antlr文档中窃取示例:

    BLOCK_COMMENT
        : '/*' .*? '*/' -> channel(HIDDEN)
        ;
    LINE_COMMENT
        : '//' ~[\r\n]* -> channel(HIDDEN)
        ;