antlr 4 词法分析器规则 RULE: '<TAG>'; 不被识别为标记,但如果片段规则则识别



编辑:有人问我是否能提供完整的语法。我不能,原因如下:

我无法提供完整的语法代码,因为这是家庭作业,我不允许透露我的解决方案,如果我的问题因此无法回答,我将非常抱歉地理解。我只是希望这是一件简单的事情,我只是没有从文档中理解,这将足以让了解antlr4的人知道答案。

这是在最初的答案中发布的,但为了防止可能的帮助者感到沮丧,我现在将其提升到帖子的顶部。免责声明:这与家庭作业有关。

我正试图将一段文本标记为家庭作业,除了以下内容外,几乎所有内容都如预期一样:

TIME                    : '<time>';

这条规则曾经在我的语法里。当标记文本时,我不会看到TIME标记,而是会看到'<time>'标记(我想Antlr不知怎么为我创建的)。但是,当我将字符串本身移动到片段规则并使TIME规则指向它时,就像这样:

fragment TIME_TAG       : '<time>';
.
.
.
TIME                    : TIME_TAG;

然后我看到了TIME标记,正如预期的那样。我在网上搜索了好几个小时都找不到答案。

发生的另一件事是雅典规则,它被定义为:

ATHLETE                 : WHITESPACE* '<athlete>' WHITESPACE*;

也被正确识别,我看到了代币ATHLETE,但当我不允许在标记字符串前后使用WHITESPACE*

我无法提供完整的语法代码,因为这是家庭作业,我不允许透露我的解决方案,如果我的问题因此无法得到回答,我会很难过地理解。我只是希望这是一件简单的事情,我只是没有从文档中理解,这将足以让了解antlr4的人知道答案。

这是我的一段文字:

World Record World Record
[1] <time> 9.86 <athlete> "Carl Lewis" <country> "United
States" <date> 25 August 1991
[2] <time> 9.69 <athlete> "Tyson Gay" <country> "United
States" <date> 20 September 2009
[3] <time> 9.82 <athlete> "Donovan Baily" <country>
"Canada" <date> 27 July 1996
[4] <time> 9.58
<athlete> "Usain Bolt"
<country> "Jamaica" <date> 16 August 2009
[5] <time> 9.79 <athlete> "Maurice Greene" <country>
"United State" <date> 16 June 1999

我的任务只是将其标记化。我没有得到标记的定义,我应该自己决定。我认为'<sometag>'非常明显换行字符串、数字、日期和方括号环绕的枚举。

提前感谢任何帮助或任何有用的知识。

TIME : '<time>';规则应该可以正常工作。ANTLR只在解析器规则中为您创建令牌。(解析器规则以小写字母开头,Lexer规则以大写字母开头,所以这个确切的例子就不是这样了(也许你的规则名称以小写字母开始?)

注意:如果你转储你的代币,你会看到TIME代币是这样表示的:

[@3,5:10='<time>',<'<time>'>,2:4]

这意味着ANTLR已经将其识别为TIME令牌(我怀疑这可能是混淆的原因。这只是ANTLR打印TIME令牌的方式。)

正如@kaby76所提到的,我们通常跳过空白或将其放入隐藏通道,因为我们不想在解析器规则中明确我们允许空白的地方。这些选项中的任何一个都会导致解析器忽略它们。一个非常常见的空白规则是:

WS: [ trn]+;`.  

由于您只是在标记化,所以不需要担心解析器规则。

添加这个Lexer规则会将空白标记为单独的标记,因此您不需要在ATHLETE等规则中对其进行说明。

你需要为你的内容制定Lexer规则,但也许这会帮助你前进。

下面的实现是一个拆分的lexer/parser语法;标记化"您的输入文件。如果你愿意,你可以把两者结合起来。由于Antlr lexer语法的限制,我通常会拆分我的语法,比如当你想";superClass";lexer。

但是,如果没有一个明确的问题声明,这个实现可能不会根据需要对输入进行标记化。所有软件都必须从需求开始。如果赋值中没有给出,那么我会准确地说明识别的令牌类型是什么。

在大多数语言中,语法分析器使用的一组标记类型中不包括空白。因此,我用"->"跳过";,其告诉lexer不产生用于识别的输入的令牌。

也不清楚诸如";[1] ";将被标记为一个标记或单独标记。在下面的实现中,我为"["、"1"one_answers"]"生成单独的令牌。

使用";片段";规则可能是不必要的,所以我不包括对该功能的任何使用"片段";规则本身不能用于生成令牌,符号也不能用于语法分析器规则。它们对于通用RHS的重用非常有用。你可以在这里阅读更多关于它的信息。

FooLexer.g4:

lexer grammar FooLexer;
Athlete : '<athlete>';
Date : '<date>';
Time : '<time>';
Country : '<country>';
StringLiteral : '"' .*? '"';
Stray : [a-zA-Z]+;
OB : '[';
CB : ']';
Number : [0-9.]+;
Ws : [ trn]+ -> skip;

FooParser.g4:

parser grammar FooParser;
options { tokenVocab = FooLexer; }
start: .* EOF;

代币:

$ trparse input.txt | trtokens
Time to parse: 00:00:00.0574154
# tokens per sec = 1219.1850966813781
[@0,0:4='World',<6>,1:0]
[@1,6:11='Record',<6>,1:6]
[@2,13:17='World',<6>,1:13]
[@3,19:24='Record',<6>,1:19]
[@4,27:27='[',<7>,2:0]
[@5,28:28='1',<9>,2:1]
[@6,29:29=']',<8>,2:2]
[@7,31:36='<time>',<3>,2:4]
[@8,38:41='9.86',<9>,2:11]
[@9,43:51='<athlete>',<1>,2:16]
[@10,53:64='"Carl Lewis"',<5>,2:26]
[@11,66:74='<country>',<4>,2:39]
[@12,76:91='"UnitedrnStates"',<5>,2:49]
[@13,93:98='<date>',<2>,3:8]
[@14,100:101='25',<9>,3:15]
[@15,103:108='August',<6>,3:18]
[@16,110:113='1991',<9>,3:25]
[@17,116:116='[',<7>,4:0]
[@18,117:117='2',<9>,4:1]
[@19,118:118=']',<8>,4:2]
[@20,120:125='<time>',<3>,4:4]
[@21,127:130='9.69',<9>,4:11]
[@22,132:140='<athlete>',<1>,4:16]
[@23,142:152='"Tyson Gay"',<5>,4:26]
[@24,154:162='<country>',<4>,4:38]
[@25,164:179='"UnitedrnStates"',<5>,4:48]
[@26,181:186='<date>',<2>,5:8]
[@27,188:189='20',<9>,5:15]
[@28,191:199='September',<6>,5:18]
[@29,201:204='2009',<9>,5:28]
[@30,207:207='[',<7>,6:0]
[@31,208:208='3',<9>,6:1]
[@32,209:209=']',<8>,6:2]
[@33,211:216='<time>',<3>,6:4]
[@34,218:221='9.82',<9>,6:11]
[@35,223:231='<athlete>',<1>,6:16]
[@36,233:247='"Donovan Baily"',<5>,6:26]
[@37,249:257='<country>',<4>,6:42]
[@38,260:267='"Canada"',<5>,7:0]
[@39,269:274='<date>',<2>,7:9]
[@40,276:277='27',<9>,7:16]
[@41,279:282='July',<6>,7:19]
[@42,284:287='1996',<9>,7:24]
[@43,290:290='[',<7>,8:0]
[@44,291:291='4',<9>,8:1]
[@45,292:292=']',<8>,8:2]
[@46,294:299='<time>',<3>,8:4]
[@47,301:304='9.58',<9>,8:11]
[@48,308:316='<athlete>',<1>,9:1]
[@49,318:329='"Usain Bolt"',<5>,9:11]
[@50,333:341='<country>',<4>,10:1]
[@51,343:351='"Jamaica"',<5>,10:11]
[@52,353:358='<date>',<2>,10:21]
[@53,360:361='16',<9>,10:28]
[@54,363:368='August',<6>,10:31]
[@55,370:373='2009',<9>,10:38]
[@56,378:378='[',<7>,12:0]
[@57,379:379='5',<9>,12:1]
[@58,380:380=']',<8>,12:2]
[@59,382:387='<time>',<3>,12:4]
[@60,389:392='9.79',<9>,12:11]
[@61,394:402='<athlete>',<1>,12:16]
[@62,404:419='"Maurice Greene"',<5>,12:26]
[@63,421:429='<country>',<4>,12:43]
[@64,432:445='"United State"',<5>,13:0]
[@65,447:452='<date>',<2>,13:15]
[@66,454:455='16',<9>,13:22]
[@67,457:460='June',<6>,13:25]
[@68,462:465='1999',<9>,13:30]
[@69,466:465='',<-1>,13:34]

相关内容

  • 没有找到相关文章

最新更新