当前位置: 首页 > 知识库问答 >
问题:

ANTLR4格伦钻机似乎没有正确地报告代币...我明白这个吗?

张晨朗
2023-03-14

我正在用grun测试一些语法,我没有看到我的令牌被识别为令牌。我最初认为我可能已经基于这个StackOverflow链接创建了“隐式”令牌。

此外,在回顾grun-tokens的输出时,我发现了这些链接:1)最近对-tokens输出的更改。2)可能已经过时的testrig.md我已经发现并正在深入研究它。

下面是我的简单hellotc.g4,在这里我探索了以下内容:

grammar HelloTC;
r  : HELLO id; 
WS : [ \r\t\n]+ -> skip ;
CMD: '%';
DIR: '%%';
A:   'A'; 
AA:  'AA';
HELLO:'hello';
ID : [a-z]+ ;
id :  DIR | CMD | A | AA;

我用以下方法进行测试:

grun HelloTC r -tokens
hello %%
hello %
hello A
hello AA
^Z

[@0,0:4='hello',<'hello'>,1:0]
[@1,6:7='%%',<'%%'>,1:6]
[@2,10:14='hello',<'hello'>,2:0]
[@3,16:16='%',<'%'>,2:6]
[@4,19:23='hello',<'hello'>,3:0]
[@5,25:25='A',<'A'>,3:6]
[@6,28:32='hello',<'hello'>,4:0]
[@7,34:35='AA',<'AA'>,4:6]
[@8,38:37='<EOF>',<EOF>,5:0]

我的代币没有一个被识别为代币。我在期待:

[@0,0:4='hello',<HELLO>,1:0]
[@1,6:7='%%',<DIR>,1:6]
[@2,10:14='hello',<HELLO>,2:0]
[@3,16:16='%',<CMD>,2:6]
[@4,19:23='hello',<HELLO>,3:0]
[@5,25:25='A',<A>,3:6]
[@6,28:32='hello',<HELLO>,4:0]
[@7,34:35='AA',<AA>,4:6]
[@8,38:37='<EOF>',<EOF>,5:0]

在我的预期结果中,我用令牌名称替换了“chars”。

我使用-xlog运行了antlr4,并且我的标记被声明(从第二行到最后一行),所以现在我想知道我是否误解了grun日志所报告的内容。我希望<>中的数据是lexer传递的令牌名。我说错了吗?

2017-01-20 06:57:29:640 grammar LogManager.java:25 before: (COMBINED_GRAMMAR HelloTC (RULES (RULE r (BLOCK (ALT HELLO id))) (RULE WS (BLOCK (LEXER_ALT_ACTION (ALT (+ (BLOCK (ALT [ \r\t\n])))) skip))) (RULE CMD (BLOCK (ALT '%cat'))) (RULE DIR (BLOCK (ALT '%%'))) (RULE A (BLOCK (ALT 'A'))) (RULE AA (BLOCK (ALT 'AA'))) (RULE HELLO (BLOCK (ALT 'hello'))) (RULE id (BLOCK (ALT DIR) (ALT CMD) (ALT A) (ALT AA)))))
2017-01-20 06:57:29:661 grammar LogManager.java:25 after: (COMBINED_GRAMMAR HelloTC (RULES (RULE r (BLOCK (ALT HELLO id))) (RULE WS (BLOCK (LEXER_ALT_ACTION (ALT (+ (BLOCK (ALT [ \r\t\n])))) skip))) (RULE CMD (BLOCK (ALT '%cat'))) (RULE DIR (BLOCK (ALT '%%'))) (RULE A (BLOCK (ALT 'A'))) (RULE AA (BLOCK (ALT 'AA'))) (RULE HELLO (BLOCK (ALT 'hello'))) (RULE id (BLOCK (ALT (SET DIR CMD A AA))))))
2017-01-20 06:57:29:694 grammar LogManager.java:25 after extract implicit lexer =(COMBINED_GRAMMAR HelloTC (RULES (RULE r (BLOCK (ALT HELLO id))) (RULE id (BLOCK (ALT (SET DIR CMD A AA))))))
2017-01-20 06:57:29:694 grammar LogManager.java:25 lexer =(LEXER_GRAMMAR HelloTCLexer (RULES (RULE WS (BLOCK (LEXER_ALT_ACTION (ALT (+ (BLOCK (ALT [ \r\t\n])))) skip))) (RULE CMD (BLOCK (ALT '%cat'))) (RULE DIR (BLOCK (ALT '%%'))) (RULE A (BLOCK (ALT 'A'))) (RULE AA (BLOCK (ALT 'AA'))) (RULE HELLO (BLOCK (ALT 'hello')))))
2017-01-20 06:57:30:040 semantics LogManager.java:25 tokens={EOF=-1, WS=1, CMD=2, DIR=3, A=4, AA=5, HELLO=6}
2017-01-20 06:57:30:040 semantics LogManager.java:25 strings={'%cat'=2, '%%'=3, 'A'=4, 'AA'=5, 'hello'=6}

下面是我试图为其创建语法的语法类型的示例

//COMMENTS
;comments
%%DIRECTIVEA
%%DIRECTIVEB
RESERVED_TOKEN(ARGS,ARGS)
%commandA
 commandB
 commandD
 commandE
 ...
 CommandH  (only A-H allowed)
// comments
%commandB
%%DIRECTIVEB
%commandD
 commandE
%commandA
 done

我还在挖掘和做实验。希望这个问题和任何答案都能帮助别人。

共有1个答案

宗项禹
2023-03-14

我也很惊讶。在以前的版本中,令牌的名称甚至没有翻译:

[@0,0:4='hello',<6>,1:0]
[@1,6:7='%%',<3>,1:6]
[@2,9:13='hello',<6>,2:0]
[@3,15:15='%',<2>,2:6]
[@4,17:21='hello',<6>,3:0]
[@5,23:23='A',<4>,3:6]
[@6,25:29='hello',<6>,4:0]
[@7,31:32='AA',<5>,4:6]
[@8,34:33='<EOF>',<-1>,5:0]

几年前,我编写了一个Ruby脚本,通过获取 .tokens 文件将 转换为名称。现在在4.6中已经完成了。

如果以这种方式并按照以下顺序定义HELLO和ID:

HELLO
    : [a-z]+ {getText().equals("hello")}? ;
ID  : [a-z]+ ;

通过此输入

    hello %%
...
    hello xyz

您有这样的结果:

    [@0,0:4='hello',<HELLO>,1:0]
    [@1,6:7='%%',<'%%'>,1:6]
...
    [@8,34:38='hello',<HELLO>,5:0]
    [@9,40:42='xyz',<ID>,5:6]
$ grun Question r -tokens data.txt 
line 1:9 token recognition error at: '1'
line 1:10 token recognition error at: '2'
line 1:11 token recognition error at: '3'
[@0,0:4='hello',<HELLO>,1:0]
[@1,6:7='%%',<'%%'>,1:6]
INT : [0-9]+ ;

然后识别新令牌:

[@0,0:4='hello',<HELLO>,1:0]
[@1,6:7='%%',<'%%'>,1:6]
[@2,9:11='123',<INT>,1:9]
 类似资料:
  • 编辑:当我使用ANTLRWorks以相同的语法输入时,会抛出一个NoViableAltException。我如何通过代码得到错误?

  • 我正在使用Mapstruct 1.3.0投影这个源对象; 进入本DTO: 在我的界面中,我没有为字段“noMappingDefined”定义任何映射 在构建项目时,将POM中的compilerArgs中的UnappedTargetPolicy设置为WARN不会导致任何通知,并且在Mapstruct生成的目标类中找不到没有映射的字段。 生成的类没有像预期的那样包括未映射的字段,但是我希望在构建项目时

  • 这是我的功能: 我有十个测试,完全是这样的: 因此,根据我的计算,一次测试只会产生1/10,000次重复运行,10次测试只会产生1/1000次重复运行。然而,它在大约50%的运行中创建了副本,我不知道为什么。

  • 问题内容: 我正在为我的android应用程序使用retrofit:2.0.0-beta4。 我尝试使用Retrofit添加用户,该用户已在Database中正确创建,但是出现以下错误: 服务器返回的结果是: 这是正确的json格式,我不明白为什么会收到这样的异常? 这是我们的界面: 呼叫者代码为: 有人可以提供任何线索吗? 问题答案: 最后,我解决了与json宽松模式无关的问题,我的POST响应

  • 我现在正在做一个Java游戏项目,我正在尝试导入音乐。然而,我似乎无法让它工作:

  • 运行此代码时,Clang(3.9.1)和GCC(7,快照)将“1”、“2”打印到控制台。 但是,MSVC未能编译此代码: source_file.cpp(15):错误C2668:字典::集:对重载函数的模糊调用 source_file.cpp(9):注意:可能是“无效字典::集(int64_t)” source_file.cpp(8):注意:或'无效字典::集(const char*)' 源文件。