- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 ANTLR4 (org.antlr:antlr4-runtime:4.0) 解析 Magic 卡。这个最小化版本能够解析诸如附魔生物
,附魔黑色生物
,...,以及保护生物
,免受传奇生物侵害
,...
现在我正在尝试启用黑色保护
,但这给我带来了问题。
我有以下词法分析器和解析器语法,以及一个测试类:
词法分析器:
lexer grammar OracleLexer;
Black: 'black';
Creature: 'creature';
Creatures: 'creatures';
Enchant: 'enchant';
From: 'from';
Legendary: 'legendary';
Protection: 'protection';
WS: [ \t\f\r\n]+ -> skip;
解析器:
parser grammar OracleParser;
options {
tokenVocab = OracleLexer;
}
line:
keywordAbility EOF;
keywordAbility:
Enchant singularObject #Enchant |
Protection From pluralObject #Protection; // (A)
// Protection From (pluralObject | objectQuality) #Protection; // (B)
singularObject:
objectQuality? Creature;
pluralObject:
objectQuality? Creatures;
objectQuality:
cardtypeQuality+? |
supertypeQuality+ cardtypeQuality*? |
colorQuality+ supertypeQuality* cardtypeQuality*?;
colorQuality:
Black;
supertypeQuality:
Legendary;
cardtypeQuality:
Creature;
测试类:
import static java.util.Arrays.*;
import static java.util.Collections.*;
import java.util.List;
import org.antlr.v4.runtime.*;
public class OracleParserTest {
private static final List<String> ruleNames = unmodifiableList(asList(OracleParser.ruleNames));
public static void main(String[] args) throws Exception {
parse("Enchant creature");
parse("Enchant black creature");
parse("Protection from black");
parse("Protection from black creatures");
}
private static void parse(String ability) throws RecognitionException {
OracleLexer lexer = new OracleLexer(new ANTLRInputStream(ability.toLowerCase()));
lexer.removeErrorListeners();
lexer.addErrorListener(new BailErrorListener());
OracleParser parser = new OracleParser(new CommonTokenStream(lexer));
parser.removeErrorListeners();
parser.setErrorHandler(new BailErrorStrategy());
RuleContext ctx = parser.line();
System.out.println(ctx.toStringTree(ruleNames));
ctx.inspect(ruleNames);
}
}
在解析器中,有一个 keywordAbility
规则,我在其中将替代 (A)
更改为 (B)
,突然间,我无法再匹配附魔黑色生物
。以下是所有文本形式的解析树,如果有帮助的话:
original strings
Enchant creature
Enchant black creature
Protection from black
Protection from black creatures
parse trees variant (A)
(line (keywordAbility enchant (singularObject creature)) <EOF>)
(line (keywordAbility enchant (singularObject (objectQuality (colorQuality black)) creature)) <EOF>)
does not parse - expected
(line (keywordAbility protection from (pluralObject (objectQuality (colorQuality black)) creatures)) <EOF>)
parse trees variant (B)
(line (keywordAbility enchant (singularObject creature)) <EOF>)
does not parse - problem!
(line (keywordAbility protection from (objectQuality (colorQuality black))) <EOF>)
(line (keywordAbility protection from (pluralObject (objectQuality (colorQuality black)) creatures)) <EOF>)
这是附魔黑色生物
的堆栈跟踪:
Exception in thread "main" org.antlr.v4.runtime.misc.ParseCancellationException
at org.antlr.v4.runtime.BailErrorStrategy.recover(BailErrorStrategy.java:51)
at net.slightlymagic.laterna.oracle.grammar.OracleParser.objectQuality(OracleParser.java:462)
at net.slightlymagic.laterna.oracle.grammar.OracleParser.singularObject(OracleParser.java:235)
at net.slightlymagic.laterna.oracle.grammar.OracleParser.keywordAbility(OracleParser.java:161)
at net.slightlymagic.laterna.oracle.grammar.OracleParser.line(OracleParser.java:79)
at net.slightlymagic.laterna.oracle.grammar.OracleParserTest.parse(OracleParserTest.java:49)
at net.slightlymagic.laterna.oracle.grammar.OracleParserTest.main(OracleParserTest.java:35)
Caused by: org.antlr.v4.runtime.NoViableAltException
at org.antlr.v4.runtime.atn.ParserATNSimulator.noViableAlt(ParserATNSimulator.java:1532)
at org.antlr.v4.runtime.atn.ParserATNSimulator.execATNWithFullContext(ParserATNSimulator.java:816)
at org.antlr.v4.runtime.atn.ParserATNSimulator.execATN(ParserATNSimulator.java:701)
at org.antlr.v4.runtime.atn.ParserATNSimulator.predictATN(ParserATNSimulator.java:389)
at org.antlr.v4.runtime.atn.ParserATNSimulator.adaptivePredict(ParserATNSimulator.java:346)
at net.slightlymagic.laterna.oracle.grammar.OracleParser.objectQuality(OracleParser.java:440)
... 5 more
如何让语法(再次)解析此功能,以及为什么它不能按原样工作?
(我曾尝试删除 BailErrorStrategy,这使它可以工作,但也会导致 90% 的所有 Magic 能力被解析为误报,并且没有解释为什么该能力之前有效。BailErrorStrategy 是否/应该干扰回溯? )
最佳答案
ANTLR 4 不使用回溯(运行时库实际上不包含任何形式的此类功能的代码)。
我无法使用此消息末尾的测试来重现此问题。我的猜测是以下原因之一导致了问题:
BailErrorStrategy
添加到您的词法分析器中。它从来没有打算以这种方式使用。相反,请遵循 my other answer 中的建议。将语法错误专门推迟给解析器。测试用例:
@Test
public void testCardParsing() throws Exception {
String grammar =
"grammar Oracle;\n" +
"\n" +
"line @init{setErrorHandler(new BailErrorStrategy());} @after {System.out.println($ctx.toStringTree(this));} :\n" +
" keywordAbility EOF;\n" +
"\n" +
"keywordAbility:\n" +
" Enchant singularObject #Enchant |\n" +
"// Protection From pluralObject #Protection; // (A)\n" +
" Protection From (pluralObject | objectQuality) #Protection; // (B)\n" +
"\n" +
"singularObject:\n" +
" objectQuality? Creature;\n" +
"\n" +
"pluralObject:\n" +
" objectQuality? Creatures;\n" +
"\n" +
"objectQuality:\n" +
" cardtypeQuality+? |\n" +
" supertypeQuality+ cardtypeQuality*? |\n" +
" colorQuality+ supertypeQuality* cardtypeQuality*?;\n" +
"\n" +
"colorQuality:\n" +
" Black;\n" +
"\n" +
"supertypeQuality:\n" +
" Legendary;\n" +
"\n" +
"cardtypeQuality:\n" +
" Creature;\n" +
"\n" +
"Black: 'black';\n" +
"Creature: 'creature';\n" +
"Creatures: 'creatures';\n" +
"Enchant: 'enchant';\n" +
"From: 'from';\n" +
"Legendary: 'legendary';\n" +
"Protection: 'protection';\n" +
"\n" +
"WS: [ \\t\\f\\r\\n]+ -> skip;";
String input = "enchant creature";
String found = execParser("Oracle.g4", grammar, "OracleParser", "OracleLexer", "line", input, true);
assertEquals("(line (keywordAbility enchant (singularObject creature)) <EOF>)\n", found);
assertNull(stderrDuringParse);
input = "enchant black creature";
found = execParser("Oracle.g4", grammar, "OracleParser", "OracleLexer", "line", input, false);
assertEquals("(line (keywordAbility enchant (singularObject (objectQuality (colorQuality black)) creature)) <EOF>)\n", found);
assertNull(stderrDuringParse);
input = "protection from black";
found = execParser("Oracle.g4", grammar, "OracleParser", "OracleLexer", "line", input, false);
assertEquals("(line (keywordAbility protection from (objectQuality (colorQuality black))) <EOF>)\n", found);
assertNull(stderrDuringParse);
input = "protection from black creatures";
found = execParser("Oracle.g4", grammar, "OracleParser", "OracleLexer", "line", input, false);
assertEquals("(line (keywordAbility protection from (pluralObject (objectQuality (colorQuality black)) creatures)) <EOF>)\n", found);
assertNull(stderrDuringParse);
}
关于java - 为什么我的 ANTLR4 语法中的这一添加会破坏不相关的规则替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26142835/
我创建了一个用户可以添加测试的字段。这一切运行顺利我只希望当用户点击(添加另一个测试)然后上一个(添加另一个测试)删除并且这个显示在新字段中。 所有运行良好的唯一问题是点击(添加另一个字段)之前添加另
String[] option = {"Adlawan", "Angeles", "Arreza", "Benenoso", "Bermas", "Brebant
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在努力将 jQuery 滚动功能添加到 nav-tab (Bootstrap 3)。我希望用户能够选择他们想要的选项卡,并在选项卡内容中有一个可以平滑滚动到 anchor 的链接。这是我的代码,可
我正在尝试在用户登录后再添加 2 个 ui 选项卡。首先,我尝试做一个之后。 $('#slideshow').tabs('remove', '4'); $("#slideshow ul li:last
我有一个包含选择元素的表单,我想通过选择添加和删除其中一些元素。这是html代码(这里也有jsfiddle http://jsfiddle.net/txhajy2w/):
正在写这个: view.backgroundColor = UIColor.white.withAlphaComponent(0.9) 等同于: view.backgroundColor = UICo
好的,如果其中有任何信息,我想将这些列添加到一起。所以说我有 账户 1 2 3 . 有 4 个帐户空间,但只有 3 个帐户。我如何创建 java 脚本来添加它。 最佳答案 Live Example H
我想知道是否有一种有效的预制算法来确定一组数字的和/差是否可以等于不同的数字。示例: 5、8、10、2,使用 + 或 - 等于 9。5 - 8 = -3 + 10 = 7 + 2 = 9 如果有一个预
我似乎有一个卡住的 git repo。它卡在所有基本的添加、提交命令上,git push 返回所有内容为最新的。 从其他帖子我已经完成了 git gc 和 git fsck/ 我认为基本的调试步骤是
我的 Oracle SQL 查询如下- Q1- select hca.account_number, hca.attribute3, SUM(rcl.extended_amou
我正在阅读 http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingG
我正在尝试添加一个“加载更多”按钮并限制下面的结果,这样投资组合页面中就不会同时加载 1000 个内容,如下所示:http://typesetdesign.com/portfolio/ 我对 PHP
我遇到这个问题,我添加了 8 个文本框,它工作正常,但是当我添加更多文本框(如 16 个文本框)时,它不会添加最后一个文本框。有人遇到过这个问题吗?提前致谢。 Live Link: JAVASCRIP
add/remove clone first row default not delete 添加/删除克隆第一行默认不删除&并获取正确的SrNo(例如:添加3行并在看到问题后删除SrNo.2)
我编码this ,但删除按钮不起作用。我在控制台中没有任何错误.. var counter = 0; var dataList = document.getElementById('materi
我有一个类似数组的对象: [1:数组[10]、2:数组[2]、3:数组[2]、4:数组[2]、5:数组[3]、6:数组[1]] 我正在尝试删除前两个元素,执行一些操作,然后将它们再次插入到同一位置。
使用的 Delphi 版本:2007 你好, 我有一个 Tecord 数组 TInfo = Record Name : String; Price : Integer; end; var Info
我使用了基本的 gridster 代码,然后我声明了通过按钮添加和删除小部件的函数它工作正常但是当我将调整大小功能添加到上面的代码中时,它都不起作用(我的意思是调整大小,添加和删除小部件) 我的js代
title 323 323 323 title 323 323 323 title 323 323 323 JS $(document).keydown(function(e){
我是一名优秀的程序员,十分优秀!