我正在尝试解析一个表达式a IN [3 .. 5[,其中尖括号的方向决定了区间是包含还是排除.我希望将其重写为AST
NODE-TYPE
|
+------------+-----------+
| | |
variable lower-bound upper-bound
Run Code Online (Sandbox Code Playgroud)
其中NODE-TYPE是BTW_INCLUSIVE,BTW_EXCL_LOWER,BTW_EXCL_UPPER或BTW_EXCL_BOTH之一,具体取决于尖括号的方向.
我有以下解析规则:
interval_expr : expr1=variable IN
(LBRACKET|RBRACKET)
expr2=expression DOTDOT expr3=expression
(LBRACKET|RBRACKET)
-> ^(BETWEEN $expr1 $expr2 $expr3)
Run Code Online (Sandbox Code Playgroud)
这有效,但它不会创建正确的树节点类型.如何根据匹配的内容选择要创建的节点类型?
你们知道JRuby和Jython使用什么解析器来生成JVM字节码吗?是ANTLR还是JavaCC,还是在实现中使用其他解析器?
出于性能原因,我将C#库移植到C++.在正常操作期间,此库需要解析大约150'000个数学表达式(想想excel公式),平均长度小于150个字符.
在C#版本中,我使用GOLD解析器生成解析代码.它可以在一秒钟内解析所有150'000个表达式.
因为我们正在考虑扩展我们的语言,所以我认为转向C++可能是改为ANTLR的好机会.我已将(简单)语法移植到ANTLR并从中生成C代码.解析150'000表达式需要12秒,因为对于每个表达式,我需要创建一个新的ANTL3_INPUT_STREAM,令牌流,词法分析器和解析器 - 至少在版本3.4中,没有办法重用它们.
我很感激有人可以给我一个推荐使用的内容 - GOLD当然是一个选项,虽然生成C++或C代码似乎比C#变种复杂得多.我的语法是LALR和LL(1)兼容.最重要的是解析小输入的性能.
我正在为lexer和parser使用一个.g文件.我在语法文件中有以下几行:
@header {
package foo.bar;
}
Run Code Online (Sandbox Code Playgroud)
但是我发现包行只被放入生成的解析器源文件中,并且在FooLexer.java文件中丢失.有谁知道如何处理这个?
我成功使用StringTemplate 4在Visual Studio中进行代码生成.我已经安装了StringTemplate和ANTLR的扩展,它们非常棒.
在测试中,我可以弄清楚如何使用*.st4(StringTemplate)文件,但是如何使用*.stg(StringTemplateGroup)文件逃避了我.它是可以嵌入到另一个StringTemplate中的定义集合吗?如果是这样,那么从*.stg而不是*.st4生成的代码是什么样的?
我有一个语法显然是错误的,因为解析一个简单的文件会产生奇怪的错误信息.
我尽可能地简化了以下语法而没有改变错误(如果你删除'this'了ANTLRWorks的树gui输出,那么int样本文件的标记会有不同的颜色,尽管结构看起来是相同的).
grammar DepClsJ_no_java_debug;
module : ( methodDecl )* ;
methodDecl : pathType Identifier '()' block ;
pathType : Identifier | 'this' ;
block : '{'
( localDecl ';' )*
( statement )*
( expr )?
'}' ;
localDecl : pathType Identifier ( '=' expr )?;
statement : block | expr ';' ;
expr : dotExpr ( '=' dotExpr )* ; dotExpr : Identifier ( '.' Identifier )* ;
Identifier : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;
Run Code Online (Sandbox Code Playgroud)
演示代码:
void …Run Code Online (Sandbox Code Playgroud) 我正在使用ANTLR4来解析一个简单的脚本语言.
此语言对FOR循环使用以下语法:
FOR [I] = 1 to [N]
instructions
NEXT [I]
Run Code Online (Sandbox Code Playgroud)
为了正确,FOR循环必须在FOR关键字之后和NEXT关键字之后具有完全相同的标记.
例如,这是正确的:
FOR I = 1 TO 10
NEXT I
Run Code Online (Sandbox Code Playgroud)
虽然这是不正确的:
FOR I = 1 TO 10
NEXT J
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有一个看起来像这样的规则:
forloop
: FOR VARNAME EQUAL INT TO INT instructions NEXT VARNAME
;
Run Code Online (Sandbox Code Playgroud)
使用以下相关词法规则(我删除了常量关键字FOR : 'FOR';):
fragment ALPHA : [a-zA-Z_];
fragment ALPHANUM : [a-zA-Z_0-9];
fragment DIGIT : [0-9];
VARNAME : ALPHA ALPHANUM*;
INT : DIGIT+;
Run Code Online (Sandbox Code Playgroud)
但是,此规则将解释为第二个实际上不正确的示例.
如何告诉ANTLR4第二个VARNAME必须与规则中的第一个相同?
我正在运行代码:https: //github.com/bkiers/antlr4-csv-demo.我想通过添加以下行来查看词法分析器分析的标记:
System.out.println("Number of tokens: " + tokens.getTokens().size())
Run Code Online (Sandbox Code Playgroud)
到Main.java:
public static void main(String[] args) throws Exception {
// the input source
String source =
"aaa,bbb,ccc" + "\n" +
"\"d,\"\"d\",eee,fff";
// create an instance of the lexer
CSVLexer lexer = new CSVLexer(new ANTLRInputStream(source));
// wrap a token-stream around the lexer
CommonTokenStream tokens = new CommonTokenStream(lexer);
// look at tokens analyzed
System.out.println("Number of tokens: " + tokens.getTokens().size())
// create the parser
CSVParser parser = new CSVParser(tokens);
// invoke the …Run Code Online (Sandbox Code Playgroud) 我在X-Text中有一个很大的语法,它有一些含糊之处.我完全知道这将导致的问题,但我希望能够在我优化它之前测试语法.
我一直试图在X-Text工作流程中打开回溯,似乎无法管理它.我在主项目下的mwe2文件中有以下代码:
language = StandardLanguage {
fragment=parser.antlr.XtextAntlrGeneratorFragment2 auto-inject{
options = {
backtrack= true
}
}
fragment=idea.parser.antlr.XtextAntlrIDEAGeneratorFragment auto-inject{
options={
backtrack=true
}
}
...
Run Code Online (Sandbox Code Playgroud)
但我仍然在表单中遇到错误:
error(211): ../org.xtext.example.CSPTest/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalMyDsl.g:1183:2: [fatal] rule ruleAny has non-LL(*) decision due to recursive rule invocations reachable from alts 1,2. Resolve by left-factoring or using syntactic predicates or using backtrack=true option.
Run Code Online (Sandbox Code Playgroud)
我怎样才能正确打开回溯以防止这种情况发生?
输入内容:
语法:
grammar test;
p : EOF;
Char : [a-z];
fragment Tab : '\t';
fragment Space : ' ';
T1 : (Tab|Space)+ ->skip;
T2 : '#' T1+ Char+;
Run Code Online (Sandbox Code Playgroud)
匹配结果如下:
[@0,0:6='# abc',<T2>,1:0] <<<<<<<< PLACE 1
[@1,7:6='<EOF>',<EOF>,1:7]
line 1:0 extraneous input '# abc' expecting <EOF>
Run Code Online (Sandbox Code Playgroud)
请忽略最后一行中的错误.我想知道为什么在PLACE 1匹配的令牌是T2.
在语法文件中,T2词法规则去后的T1词法规则.所以我希望T1首先应用规则.那么为什么# abc不跳过空格呢?
ANTLR是否使用一些贪婪策略来匹配当前字符流和最长的词法分析器规则?