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

ANTLR4中的令牌处理不一致

呼延俊风
2023-03-14

ANTLR4书引用了一个多模式示例

https://github.com/stfairy/learn-antlr4/blob/master/tpantlr2-code/lexmagic/ModeTagsLexer.g4

lexer grammar ModeTagsLexer;

// Default mode rules (the SEA)
OPEN  : '<'     -> mode(ISLAND) ;       // switch to ISLAND mode
TEXT  : ~'<'+ ;                         // clump all text together

mode ISLAND;
CLOSE : '>'     -> mode(DEFAULT_MODE) ; // back to SEA mode 
SLASH : '/' ;
ID    : [a-zA-Z]+ ;                     // match/send ID in tag to parser

https://github.com/stfairy/learn-antlr4/blob/master/tpantlr2-code/lexmagic/ModeTagsParser.g4

parser grammar ModeTagsParser;

options { tokenVocab=ModeTagsLexer; } // use tokens from ModeTagsLexer.g4

file: (tag | TEXT)* ;

tag : '<' ID '>'
    | '<' '/' ID '>'
    ;

我试图在此示例的基础上进行构建,但使用""字符作为分隔符。如果我简单地替换,我得到了错误126

<代码>无法为非组合语法中的字符串文字创建隐式标记:“«”

事实上,当我在解析器标记规则中有了字符时,这似乎就会发生。

tag : '«' ID '>';

具有

OPEN    : '«'   -> pushMode(ISLAND);
TEXT    : ~'«'+;

有没有什么我不知道的东西?这是使用antlr4 maven插件。

wiki提到了一些类似的内容,但我的阅读方式与github上的示例和使用<代码>

共有2个答案

颛孙俊
2023-03-14

您是否指定了ANTLR在读取语法时应该使用的文件编码?对于小于255的欧洲字符应该可以,但。。。

艾雪风
2023-03-14

以下情况之一正在发生:

>

  • 您忘记在ModeTagsLexer中更新打开规则。g4使用以下表格:

    OPEN  : '«' -> mode(ISLAND) ;
    

    您在ANTLR 4中发现了一个错误,应该将其报告给问题跟踪器。

  •  类似资料:
    • 我正在为一种语言编写一个编译器,作为大学使用ANTLR4的项目。我使用Java编写了这个编译器,并采用了Visitor模式,当我到达测试阶段时,我注意到ANTLR忽略了我的部分代码,并生成了它不应该生成的错误。 语法: 以下是我的主要观点: 当我运行Main时,它显示: 第1行:0不匹配的输入'import'应为{(',INT,FLOAT,STRING,IDF} 我的语法有什么地方错了吗?如果没有

    • 我们如何才能让他们识别lexer规则?所有、和规则都可能与匹配。那么我在测试它的时候应该使用什么类型。 我的意思是: 一般来说,我想了解如何知道的类型?

    • 我正在用ANTLR4/JavaScript编写一个简单的“语言”,它可以将数字与变量关联起来并打印出来。这很好,但是在扩展print语句以获取一个或多个变量之后,我不知道如何获得它们的计数。(我使用的是访问者,而不是倾听者,但我对两者都感兴趣。) 语法:

    • 我有一个ANTLR4语法,用于语法高亮显示的方法。当用户更改文本时,该方法被触发并生成CommonTokenStream。当我调用GetTokens()时,我只得到一些预期的令牌。当我调用Consume()时,我会得到更多,但不是全部。如何获取文本中的所有令牌?

    • 我是一个Antlr4新手,有一个相对简单的语法问题。语法在末尾的底部给出。(这是一个语法片段,用于分析生物序列变体的描述)。 在下面的单元测试中,我试图解析字符串。 这里出了什么问题?我在哪里可以学习如何解决这个问题?

    • 我正在做一个Android应用程序,使用Firebase云消息。