gpt4 book ai didi

java - 无法解释 ANTLRWorks 输出

转载 作者:行者123 更新时间:2023-12-01 15:33:26 26 4
gpt4 key购买 nike

我使用以下简单语法来了解 ANTLR。

grammar Example;
options {
language=Java;
}

ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;

INT : '0'..'9'+
;
PLUS : '+';


ADDNUM :
INT PLUS INT;

prog : ADDNUM;

当我尝试在 ANTLRWorks 中针对输入 1+2 运行语法时,我在控制台中收到以下错误:

[16:54:08] Interpreting... [16:54:08] problem matching token at 2:0
NoViableAltException(' '@[1:1: Tokens : ( ID | INT | PLUS | ADDNUM);])

任何人都可以帮我理解我哪里出了问题吗?

最佳答案

您可能没有将 prog 指定为 ANTLRWorks 中的起始规则。如果你这样做了,一切都会好起来的。

但是您确实不应该像在 ADDNUM 中那样创建与表达式匹配的词法分析器规则:这应该是解析器规则:

grammar Example;

prog : addExpr EOF;
addExpr : INT PLUS INT;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
INT : '0'..'9'+;
PLUS : '+';
<小时/>

ANTLR规则

何时使用解析器、词法分析器或片段规则没有严格的规则,但它们通常用于以下用途:

词法分析器规则

词法分析器规则通常是语言的最小部分(字符串、数字、标识符、注释等)。尝试从像 1+2 这样的输入创建词法分析器规则会导致问题,因为:

  • 如果您想从该标记中提取一些有意义的内容(例如对其进行评估),则需要拆分该标记的内容,因为在从中创建 1 个标记后,整个表达式中的文本将“粘合”在一起;
  • 当其之间有空格时,您会遇到问题:1 +   2

表达式 1+2 是三个标记:INTPLUS 和另一个 INT

片段规则

当您不希望此规则成为“真实” token 时,可以使用片段规则。例如,采用以下词法分析器规则:

ID    : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
FLOAT : '0'..'9'+ '.' '0'..'9'+;
INT : '0'..'9'+;

在上面的规则中,您使用了'0'..'9'四次,因此您可以将其放在单独的规则中

ID    : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | DIGIT)*
FLOAT : DIGIT+ '.' DIGIT+;
INT : DIGIT+;
DIGIT : '0'..'9';

但是您不想创建 DIGIT 标记:您只希望其他词法分析器规则使用 DIGIT。在这种情况下,您可以创建一个 fragment 规则:

ID    : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | DIGIT)*
FLOAT : DIGIT+ '.' DIGIT+;
INT : DIGIT+;
fragment DIGIT : '0'..'9';

这将确保永远不会有 DIGIT 标记:因此永远不会在您的解析器规则中使用它!

解析器规则

解析器规则将标记粘合在一起:它们确保语言是 syntactic valid (a.k.a. parsing) 。需要强调的是,解析器规则可以使用其他解析器规则或词法分析器规则,但不能片段规则。

<小时/>

另请参阅:ANTLR: Is there a simple example?

关于java - 无法解释 ANTLRWorks 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9268651/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com