- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以使用 ANTLR4 从规则中提取首集和后续集?我在 ANTLR3 中对此进行了一些尝试,但没有找到令人满意的解决方案,但如果有人有这两个版本的信息,我将不胜感激。
我想根据用户的光标位置解析用户输入,然后提供自动完成的可能选项列表。目前,我对部分输入的自动完成标记不感兴趣。我想在解析过程中的某个时刻显示所有可能的后续标记。
例如:
sentence:
subjects verb (adverb)? '.' ;
subjects:
firstSubject (otherSubjects)* ;
firstSubject:
'The' (adjective)? noun ;
otherSubjects:
'and the' (adjective)? noun;
adjective:
'small' | 'orange' ;
noun:
CAT | DOG ;
verb:
'slept' | 'ate' | 'walked' ;
adverb:
'quietly' | 'noisily' ;
CAT : 'cat';
DOG : 'dog';
鉴于上面的语法...
如果用户还没有输入任何内容,自动完成列表将是 ['The'](请注意,我必须检索规则句子的第一个而不是后面的,因为基本规则的后面总是结尾)。
如果输入是“The”,自动完成列表将是 ['small', 'orange', 'cat', 'dog']。
如果输入是“The cat slept,自动完成列表将是 ['quietly', 'noisily', '.']。
因此 ANTLR3 提供了一种方法来获取一组执行此操作的方法:
BitSet followSet = state.following[state._fsp];
这很好用。我可以将一些逻辑嵌入到我的解析器中,这样当解析器调用用户所在的规则时,它会检索该规则的后续内容,然后将它们提供给用户。但是,这对于嵌套规则(例如,基本规则,因为跟随集忽略并且子规则跟随,这是应该的)并不适用。
我认为如果用户完成了规则(这可能很难确定)我需要提供第一个集合,以及涵盖所有有效选项的以下集合。我还认为我需要构建我的语法,使两个标记永远不会在规则级别上出现。
我会把上面的“firstSubject”规则分解成一些子规则......
来自
firstSubject:
'The'(adjective)? CAT | DOG;
到
firstSubject:
the (adjective)? CAT | DOG;
the:
'the';
我还没有找到任何关于从规则中检索第一个集合的信息。
ANTLR4 似乎已经彻底改变了它在生成的解析器级别上的工作方式,所以在这一点上我不确定我是应该继续使用 ANTLR3 还是跳转到 ANTLR4。
如有任何建议,我们将不胜感激。
最佳答案
ANTLRWorks 2 (AW2) 执行类似的操作,我将在此处进行描述。如果您引用 AW2 的源代码,请记住它仅在 LGPL 许可下发布。
创建一个特殊标记,代表代码完成的兴趣位置。
EOF
.特别是 ParserATNSimulator
从不使用此 token ;总是在达成决定时或之前做出决定。g
,解析器将允许该标记匹配规则名称或关键字 grammar
.创建一个专门的 ATN 解释器,它可以返回所有可能导致插入符标记的解析树,而无需查看插入符以做出任何决定,也不会限制插入符标记的确切标记类型。
对于每个可能的解析树,在解析器规则中匹配的任何插入符标记的上下文中评估您的代码完成。
第 3 步中找到的所有结果的并集是完整的有效代码完成结果集的超集,可以在 IDE 中呈现。
下面介绍AW2对上述步骤的实现。
CaretToken
, 它始终具有 token 类型 CARET_TOKEN_TYPE
.ForestParser<TParser>
表示接口(interface),大部分可重用实现在 AbstractForestParser<TParser>
中并专门用于解析 ANTLR 4 语法以在 GrammarForestParser
中完成代码.GrammarCompletionQuery.TaskImpl.runImpl(BaseDocument)
执行.关于antlr3 - 从 ANTLR4 解析器获取 First 和 Follow 元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19690802/
目前,我正在为网络开发类(class)做作业。 这些是说明:第一行和首字下沉样式Jakob 希望文章的第一行以小写大写字母显示。转到 First Line and Drop Cap Styles 部分
.first() 方法是在 jQuery 1.4 中添加的。 :first 选择器自 1.0 以来就已存在。 来自文档: :first The :first pseudo-class is equiv
我正在审查现有的 ASP.NET MVC (5.2.3) EF (6.1.3) 项目。 该项目使用 ASP.NET Identity,我检查了 web.config 中的 2 个连接字符串,一个用于
为什么人们使用 mid=first+(last-first)/2 而不是 (first+last)/2,在二进制搜索的情况下)两者有区别吗。如果有,请告诉我,因为我无法理解其中的区别。 最佳答案 如果
为什么人们使用 mid=first+(last-first)/2 而不是 (first+last)/2,在二进制搜索的情况下)两者有区别吗。如果有,请告诉我,因为我无法理解其中的区别。 最佳答案 如果
for(auto it = M.begin(); it!=M.end();it++) { coutfirstsecondsecond == 1) return it->firs
我试图从第二个循环中获取循环的第一项。 我知道我得到了这样的@key @../key 但@first 似乎不像@../first 那样工作 有什么想法吗? 问候 最佳答案 首先,无论是否在嵌套 blo
var tab1 = $('.tabs a:first-child').attr('href'); alert(tab1); .. 尽管同一页面上有两个 div.switch,但仅匹配一个。第二个位于
我想知道如何将节点*变量 NODE 分配给结构内的数据? struct node { int info; struct node *link; }; typedef struct nod
我有两个段落包含在一个 div 中。我想让第一段的文字变大一点,但使用 :first-child 并不能像我所说的那样工作。看不出有什么问题。
我有一个 ul li 列表 Parent child1 child2
我有三个表,即员工、部门和申诉。 Employees 表有超过一百万条记录。我需要找到员工的详细信息、他/她的部门以及他/她提出的申诉。 我可以想到以下两个查询来查找结果: 1。先过滤记录,只获取需要
我有三个表,即员工、部门和申诉。 Employees 表有超过一百万条记录。我需要找到员工的详细信息、他/她的部门以及他/她提出的申诉。 我可以想到以下两个查询来查找结果: 1。先过滤记录,只获取需要
这有什么区别吗: myList.Where(item => item == 0).First(); 还有这个: myList.First(item => item == 0); 后者对我来说更有意义,
我分不清 element:first-child 之间的区别和 element:first-of-type 例如,你有一个 div div:first-child → 全部 元素是其父元素的第一个子元
当我遇到一个奇怪的情况时,我正在研究 CSS 选择器。 如果我使用 :first-child 伪元素,我需要在它前面加上一个空格才能工作,否则它将无法工作。然而 :first-letter 伪元素的情
请考虑以下字符串数组: let strings = ["str1", "str2", "str10", "str20"] 假设需要获取包含 5 个字符的第一个元素 (String),我可以使用 fil
让我们假设我们要开始新项目 - 包含一些业务逻辑的应用程序、ASP.NET 上的用户界面、WPF 或两者。我们想使用 ORM 或 DAL 代码生成器并在 .NET 类中实现我们的业务逻辑。我们可以通过
我有一种树系统。我想做的是给所有 parent 一个 margin ,除了第一个。这是我的 HTML: Test
我分不清 element:first-child 之间的区别和 element:first-of-type 例如,你有一个 div div:first-child → 全部 元素是其父元素的第一个子元
我是一名优秀的程序员,十分优秀!