尝试升级antlr4,我在语法中有2行产生错误信息:
分配给不是一组的块的标签tok
特别是对于如下所示的语法行:
contextRadius: tok=('radius' 'change-authorize-nas-ip') (IP4_ADDRESS|IP6_ADDRESS) 'encrypted' 'key' ID 'port' INT_TOK 'event-timestamp-window' INT_TOK 'no-reverse-path-forward-check'
;
Run Code Online (Sandbox Code Playgroud)
这究竟意味着什么 - 成为一个"未设置的块"并且是否有一般解决方案?
我正在学习ANTLR4并尝试使用词法模式.如何在多个词法模式中出现相同的标记?作为一个非常简单的例子,假设我的语法有两种模式,我想在这两种模式中匹配空格和行尾,我怎么能这样做而不以WS_MODE1和WS_MODE2为结尾.有没有办法在两种情况下重用相同的定义?我希望在输出流中获得所有空白区域的WS令牌,而不管模式如何.这同样适用于EOL和其他可在两种模式下出现的关键字.
我正在使用我的解析器规则的返回,它适用于除第一个之外的所有解析器规则.如果我的语法中的第一个解析器规则使用返回声明ANTLR4抱怨如下:
在匹配规则时期待ARG_ACTION
如果我添加另一个不使用"返回"的解析器规则,ANTLR不会抱怨.
在这里你有一个语法简化问题:
grammar FirstParserRuleReturnIssue;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
aRule returns [String s]: ID { $s = $ID.text; };
Run Code Online (Sandbox Code Playgroud)
我搜索了第一条规则的特殊角色,它可以解释行为,但没有找到任何东西.这是一个错误吗?我错过了一些理解吗?
我用antlr如下:
ANTLRInputStream input = new ANTLRInputStream(System.in);
grLexer lexer = new grLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
grParser parser = new grParser(tokens);
ParseTree tree = parser.formula();
System.out.println(tree.toStringTree(parser));
Run Code Online (Sandbox Code Playgroud)
例如
line 1:0 token recognition error at: '('
line 1:1 token recognition error at: ')'
line 1:2 token recognition error at: '('
Run Code Online (Sandbox Code Playgroud)
例如
if(tree.hasError()) // FOR EXAMPLE
return;
Run Code Online (Sandbox Code Playgroud) 我正在尝试解析嵌套的布尔表达式并分别获取表达式中的各个条件.例如,如果输入字符串是:
(A = a OR B = b OR C = c AND((D = d AND E = e)OR(F = f AND G = g)))
我想以正确的顺序获得条件.即
D = d AND E = e OR F = f AND G = g AND A = a OR B = b OR C = c
我正在使用ANTLR 4来解析输入文本,这是我的语法:
grammar SimpleBoolean;
rule_set : nestedCondition* EOF;
AND : 'AND' ;
OR : 'OR' ;
NOT : 'NOT';
TRUE : 'TRUE' ;
FALSE : 'FALSE' ; …Run Code Online (Sandbox Code Playgroud) 我在一个简单的Kotlin/Gradle项目中使用Antlr,而我的Gradle构建生成Antlr源,它们无法导入到项目中.
如您所见(左侧),正在生成类(Lexer/Parser等).我还将此generated-src/antlr/main目录配置为源根目录.我看到的大多数问题都将此列为解决方案,但我已经完成了.
多次重建(在IDEA和CLI上)并且遵循所有常见的"无效缓存和重新启动"问题后,问题仍然存在.
此外,导入问题在CLI上的Gradle构建中列出,因此它似乎与IDEA无关.
我在这里错过了什么?
这是build.gradle我最初创建项目时IDEA生成的文件,以及IDEA用于项目/工作区同步的文件.
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.2.50'
}
group 'com.craigotis'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
apply plugin: 'antlr'
dependencies {
antlr "org.antlr:antlr4:4.5"
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.2.0'
}
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
Run Code Online (Sandbox Code Playgroud) 你如何将ANTLR 3中编写的这部分代码翻译成ANTLR 4?
expr: (Identifier '.')=> (refIdentifier)
| (Identifier '!')=> (refIdentifier)
| (Identifier '=>')=> (lambdaExpression);
Run Code Online (Sandbox Code Playgroud)
我的意思是这种语义谓词现在似乎不存在.我可以用什么呢?
许多语言都使用某种引号绑定了一个字符串,如下所示:
"Rob Malda is smart."
ANTLR 4可以将这样的字符串与词法分析器规则匹配,如下所示:
QuotedString : '"' .*? '"';
要使用字符串中的某些字符,必须对它们进行转义,可能是这样的:
"Rob \"Commander Taco\" Malda is smart."
ANTLR 4也可以匹配这个字符串;
EscapedString : '"' ('\\"|.)*? '"';
(取自最终ANTLR 4参考文献的第96页)
这是我的问题:假设转义的字符与字符串分隔符是相同的字符.例如:
"Rob ""Commander Taco"" Malda is smart."
(这在Powershell中完全合法.)
lexer规则会匹配什么?我认为这会奏效:
EscapedString : '"' ('""'|.)*? '"';
但事实并非如此.词法分析器将转义字符标记"为字符串分隔符的结尾.
我有一个ANTLR 4语法,并从中构建了一个词法分析器和解析器.现在我试图以这样的方式实例化该解析器,它将解析直到遇到错误.如果遇到错误,则不应继续解析,但应提供有关问题的有用信息; 理想情况下是机器可读的位置和人类可读的消息.
这就是我现在所拥有的:
grammar Toy;
@parser::members {
public static void main(String[] args) {
for (String arg: args)
System.out.println(arg + " => " + parse(arg));
}
public static String parse(String code) {
ErrorListener errorListener = new ErrorListener();
CharStream cstream = new ANTLRInputStream(code);
ToyLexer lexer = new ToyLexer(cstream);
lexer.removeErrorListeners();
lexer.addErrorListener(errorListener);
TokenStream tstream = new CommonTokenStream(lexer);
ToyParser parser = new ToyParser(tstream);
parser.removeErrorListeners();
parser.addErrorListener(errorListener);
parser.setErrorHandler(new BailErrorStrategy());
try {
String res = parser.top().str;
if (errorListener.message != null)
return "Parsed, but " + errorListener.toString();
return …Run Code Online (Sandbox Code Playgroud)