例如,我在语法中定义了几个词法分析器规则:
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是一个小例子。
答案 0 :(得分:0)
根据您使用词法分析器的其他用途,您可以探索2种途径。
使用type()
词法分析器命令来重新映射令牌。
从那里的文档中获取示例:
lexer grammar SetType;
tokens { STRING }
DOUBLE : '"' .*? '"' -> type(STRING) ;
SINGLE : '\'' .*? '\'' -> type(STRING) ;
WS : [ \r\t\n]+ -> skip ;
这将允许针对单一类型STRING
(您将在流中收到的令牌类型)使用多个规则。
具有令牌流的channel()
命令可用于标记和过滤令牌。如果您以后仍需要解析,这样做的好处是保留了原始词法分析器流。
再次,从antlr文档中窃取示例:
BLOCK_COMMENT
: '/*' .*? '*/' -> channel(HIDDEN)
;
LINE_COMMENT
: '//' ~[\r\n]* -> channel(HIDDEN)
;