我对 ANTLR 很陌生,所以这可能是一个简单的问题。
我定义了一种简单的语法,它应该包含带有数字和标识符的算术表达式(以字母开头并以一个或多个字母或数字继续的字符串。)
语法如下:
grammar while;
@lexer::header {
package ConFreeG;
}
@header {
package ConFreeG;
import ConFreeG.IR.*;
}
@parser::members {
}
arith:
term
| '(' arith ( '-' | '+' | '*' ) arith ')'
;
term returns [AExpr a]:
NUM
{
int n = Integer.parseInt($NUM.text);
a = new Num(n);
}
| IDENT
{
a = new Var($IDENT.text);
}
;
fragment LOWER : ('a'..'z');
fragment UPPER : ('A'..'Z');
fragment NONNULL : ('1'..'9');
fragment NUMBER : ('0' | NONNULL);
IDENT …Run Code Online (Sandbox Code Playgroud) 我以一种虚拟语言为例:它只接受一个或多个“!”。它的词法分析器和语法规则是:
grammar Ns;
options {
output=AST;
ASTLabelType=CommonTree;
}
tokens {
NOTS;
}
@header {
package test;
}
@lexer::header {
package test;
}
ns : NOT+ EOF -> ^(NOTS NOT+);
NOT : '!';
Run Code Online (Sandbox Code Playgroud)
好的,如您所见,这代表一种接受“!”的语言 或者 '!!!' 或者 '!!!!!'...
我定义了一些有意义的类来构建 AST:
public class Not {
public static final Not SINGLETON = new Not();
private Not() {
}
}
public class Ns {
private List<Not> nots;
public Ns(String nots) {
this.nots = new ArrayList<Not>();
for (int i = 0; i < nots.length(); i++) …Run Code Online (Sandbox Code Playgroud) 这在 ANTLR 4 中无法编译:
Number options { backtrack=true; }
: (IntegerLiteral Range)=> IntegerLiteral { $type = IntegerLiteral; }
| (FloatLiteral)=> FloatLiteral { $type = FloatLiteral; }
| IntegerLiteral { $type = IntegerLiteral; }
;
Run Code Online (Sandbox Code Playgroud)
因为backtrace=true...发生了什么?
除了它之外,我应该在 ANTLR 4 中使用什么?
我最近开始玩 ANTLR4 和 C#。我喜欢扩展为 Visual Studio 提供的全面支持。我不喜欢的是,每当我生成 Lexer/Parser 时,它都会进入我项目的默认命名空间 - 这不是我想要的,因为它会自动生成,尝试将其推入项目的默认命名空间是一种无望的活动。手动正确的命名空间。有什么办法可以改变这种情况吗?@parser/lexer::namespace { } 和选项中的名称空间(带或不带指定语言)似乎不起作用。
有什么办法可以做到吗?
谢谢!
我想生成Pascaljava 解析器,然后在我的gradle应用程序中使用它。
因为Pascal我使用了这个语法
https://github.com/antlr/grammars-v4/tree/master/pascal
我的build.gradle样子是这样的 我用了antlr插件。
apply plugin: 'groovy'
apply plugin: 'antlr'
repositories {
jcenter()
}
dependencies {
compile 'org.codehaus.groovy:groovy-all:2.4.6'
compile 'org.antlr:antlr4:4.5.3'
testCompile 'org.spockframework:spock-core:1.0-groovy-2.4'
testCompile 'junit:junit:4.12'
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试运行任务时generateGrammarSource出现此错误
:generateGrammarSource
L:\app\src\main\antlr\pascal.g4:36:1: unexpected token: grammar
error: Token stream error reading grammar(s):
L:\app\src\main\antlr\pascal.g4:804:8: expecting ''', found '='
L:\app\src\main\antlr\pascal.g4:36:1: unexpected token: grammar
error: Token stream error reading grammar(s):
L:\app\src\main\antlr\pascal.g4:804:8: expecting ''', found '='
L:\app\src\main\antlr\pascal.g4:36:1: rule grammar trapped:
L:\app\src\main\antlr\pascal.g4:36:1: unexpected token: grammar
TokenStreamException: …Run Code Online (Sandbox Code Playgroud) 我在 github 上的 antlr4 文档中阅读了很多内容,我有点了解它是如何工作的。问题是我不是专业的java编码员,我正在尝试将antlr4与python一起使用。
无论如何,我在执行此步骤时遇到了死胡同
antlr4 -Dlanguage=Python2 Hello.g4
Run Code Online (Sandbox Code Playgroud)
我下载了antlr4complete.jar,但我不知道如何设置或使用它。有什么帮助吗?
我有一个有效的语法并实现了一个监听器(在 Java 中)。我可以在控制台中用缩进显示解析树,但是我想将它导出为 JSON 结构,以便它可以在任何通用查看器中使用。
是否有一种已经制作的方法可以做到这一点,或者我是否必须以某种方式完全从头开始创建 json 文件?
谢谢!
PS:我还设法通过 TreeView 类在 Swing 中显示...
我想使用 ANTLR 的访问者模式构建一个简单的规则引擎,但是当它带有替代令牌时,我很困惑如何获取哪个替代令牌。谁能帮我吗?(抱歉我的英语不好)
grammar RuleExpression;
expression: '(' Operator arg* ')';
arg: STRING|INTEGER|BOOLEAN|expression;
STRING: '"' .+ '"';
INTEGER: [0-9]+;
BOOLEAN: 'true'|'false';
Operator: [a-zA-Z]+[0-9]*;
WS : [ \t\r\n]+ -> skip;
Run Code Online (Sandbox Code Playgroud)
如何知道 arg 是 STRING、INTEGER、BOOLEAN 或表达式?
希望这是一个非常快的;)我在ANTLR3中编写了一个词法分析器/解析器规范,并且定位于CSharp2目标.生成的代码可以正常工作,但是我无法通过ANTLR将C#输出放入命名空间.
语法文件的相关部分如下:
grammar MyGrammar;
options
{
language = CSharp2;
output = AST;
ASTLabelType = CommonTree;
}
Run Code Online (Sandbox Code Playgroud)
为了生成正确的命名空间,我尝试过:
@namespace { MyNamespace }
Run Code Online (Sandbox Code Playgroud)
和
@lexer::namespace { MyNamespace }
@parser::namespace { MyNamespace }
Run Code Online (Sandbox Code Playgroud)
但这两个都会产生错误,声称该文件没有规则.
任何帮助表示赞赏.
我正在尝试将ANTLR定义的语法集成到NetBeans中,到目前为止,有效的语法工作正常.但是,当前如果输入任何未在某处语言中定义的字符(例如,"?"字符),自定义编辑器会立即崩溃,因为它无法找到该字符的规则.
在没有整个词法分析器崩溃和刻录的情况下,ANTLR中是否有一种方法可以捕获并跳过与规则不匹配的每个字符(并且可能输出错误消息)?我想标记无效字符,跳过它们,然后继续lexing,例如:
//some rules + tokens
invalidCharacter
: <<catch all other characters>>
{System.out.println("undefined character entered!")}
;
Run Code Online (Sandbox Code Playgroud)
任何帮助都会被批准.
antlr ×10
antlr4 ×4
java ×4
namespaces ×2
parsing ×2
antlr3 ×1
c# ×1
character ×1
compilation ×1
gradle ×1
grammar ×1
json ×1
lexer ×1
python ×1
python-2.7 ×1