- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用以下简单语法来了解 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 : '+';
<小时/>
何时使用解析器、词法分析器或片段规则没有严格的规则,但它们通常用于以下用途:
词法分析器规则通常是语言的最小部分(字符串、数字、标识符、注释等)。尝试从像 1+2
这样的输入创建词法分析器规则会导致问题,因为:
1 + 2
。表达式 1+2
是三个标记:INT
、PLUS
和另一个 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) 。需要强调的是,解析器规则可以使用其他解析器规则或词法分析器规则,但不能片段规则。
<小时/>关于java - 无法解释 ANTLRWorks 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9268651/
ANTLR 使用的推荐模式是让 Parser 构建一个抽象语法树,然后构建 Tree walkers(AKA 树语法)来处理它们。 我试图找出为什么我的树语法不起作用的原因,并且很想使用 ANTLRW
我正在使用 ANTLRWorks 来创建 ANTLR 语法。我有一个有效的语法,并且还生成了解析器和词法分析器源文件。我还尝试调试生成的代码,并且输出与调试器输出中的预期一致。 但是当我尝试调用调试器
我使用以下简单语法来了解 ANTLR。 grammar Example; options { language=Java; } ID : ('a'..'z'|'A'..'Z'|'_') ('a'..
我有以下 ANTLR 语法: grammar mygrammar; ASSIGNMENT : ID '=' INT ; ID : ('a'..'z'|'A'..'Z'|'_'
我有以下字符串要与规则 stringLiteral 匹配: "D:\\Downloads\\Java\\MyFile" 而我的语法是文件:String.g4,如下: grammar String; f
我正在使用 ANTLRWorks 的 Debug模式来测试我的 C 语法。在 ANTLRWorks 中进行调试确实非常有助于更好地理解,但我在理解输出树的不同颜色方面遇到了问题。我在语法中使用 bac
关注How do I install this damn thing? on www.antlr.org 我有 ANTLR 3.5 可以工作: $ java -version # I have
我最近开始使用 ANTLR 并发现了 ANTLRWorks IDE。尽管编辑器工作正常,但是,当我运行测试装置时,它似乎卡在编译语法文件上(或者更确切地说,对编译的语法没有任何作用?),无论我给它什么
请帮助新手理解这一点 ANTLWorks 中的警告: [11:10:15] warning(138): BooleanExpr.g:0:1: grammar BooleanExpr: no start
我刚开始研究 ANTLR,并注意到 ANTLRWorks 1.5 生成了 Java 解析器文件,但抛出声明不完整。 语法文件: grammar ASTDemo; options { output=
ANTLRWorks 1.5 有一个“解释器”选项卡,您可以在其中输入字符串来测试解析器。到目前为止,我还没有在 ANTLRWorks 2 中找到任何等效的东西。它有类似的东西吗?如果有,如何访问它?
如果此问题已在本网站的其他地方提出和解决,请原谅我。当我在 ANTLRWorks 1.4.3 中输入示例语法时,编辑器不显示某些字符,例如竖线 ('|') 或左括号 '('。我注意到在此站点的某处 M
我正在尝试使用 antlr4 构建 MT940 解析器。语法很简单,但适用于大多数情况。 现在我想返回我自己的类(class)。这有效: file returns [String myString]
我正在使用 Java 7。更新了 antlr 配置文件以指向 Java 7。看看 StackOverflow 和其他地方的其他问题,似乎是 'NetBeans' annotation-processo
背景:我创建了一个 ANTLR 语法。我能够使用 ANTLRWorks 测试和调试它,并验证解析器创建了我心中的 AST。现在,我想为 AST 编写树语法,解析树并使用 ANTLRWorks 调试树语
我正在从事一个相当标准的编译器项目,为此我选择了 ANTLR 作为解析器生成器。在将现有语法从 v2 更新到 v3 时,我注意到 ANTLRWorks(ANTLR 的官方 IDE)没有正确显示文件中的
考虑我们尝试将一些不正确的输入文本提供给某些语法(例如,包含一些未知标记的文本)。在 ANTLRWorks 中,在解释期间我们将在图表中看到 NoViableAltException。 UPD:出现这
我可以将语法文件加载到我的 java 项目(在 netbeans 中)并生成/构建我的词法分析器和解析器类,通过反射加载它们,然后解析我需要解析的内容。 我想要的是一个简单的例子,将词法分析器和解析器
我是一名优秀的程序员,十分优秀!