- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我是 ANTLR4 的新手,现在我正在尝试了解我们可以用它定义哪种语法。
据我所知,ANTLR 中有两种规则:解析器规则(小写单词)和词法分析器规则(大写单词)。示例:
grammar Test;
init: prog(','prog)*;
prog: A
| prog
;
A: [a-z]+;
从语法产生规则的角度来看,我会说解析器规则是非终端符号,可以用词法分析器规则定义的一系列标记替换。
因此,the definition 非常清楚语法是上下文无关的| .语法生成的语言的字母表由所有由小写拉丁字母组成的单词组成。
问题:我们可以使用 ANTLR4
定义非上下文无关文法吗?
最佳答案
是的。(咳嗽)。
据我了解,您可以向规则中添加代码。任意代码可以测试任意事物,所以答案是"is"。一般来说,我不认为你可以用 ANTLR 做到这一点,但这对于许多有趣的特殊情况非常实用(例如,接受除素数之外的所有数字字符串)。
没有。
我认为如果您坚持 ANTLR 允许的语法规范,答案是否定的。事实上,您可以使用 ANTLR“指定”它无法正确处理的上下文无关语法,这对于大多数解析器生成器都是如此。 (对于 ANTLR,这包括具有间接左递归、歧义、任意先行等的语法)我们甚至通过它们的“限制”名称来调用这些解析器生成器中的大多数,例如 LL(1)、LALR(k) 等.
哪些可以做full context free?
一些解析器生成器可以处理完整的、上下文无关的语法。想到 Earley 和 CYK 解析器,但它们不是很快,因此人们倾向于避免使用它们。 GLR 解析器可以做到这一点(我们在我们的工具中使用它,因为它确实有助于为真实语言编写语法 [请参阅我的简历] 但有些语法会使它们非常慢;你基本上可以避免这些。显然 GLL 解析方案存在并且是也是完全上下文无关的;我希望他们也会遇到一些钝语法的性能问题,但在实践中也很有用。
我听说过的唯一可以执行各种上下文相关语法的解析器生成器是 MetaS .我从未使用过它,但它背后的理论令人印象深刻。声称它可以执行任意上下文相关的语法;对于任意讨厌的语法,它会产生极高的成本,但这实际上并不是一个反对意见。
关于java - 我们可以用 ANTLR 定义一个非上下文无关文法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35630746/
我正在尝试实现一个表达式处理语法(处理嵌套括号和其他内容)。到目前为止我有以下内容,但它们无法处理某些情况(成功/失败情况出现在以下代码块之后)。有人知道这是怎么回事吗? 注意:varname +=
我在 ANTLR 语法中写下了以下语句: loopStatement : 'loop' (statement|exit)* 'end' 'loop' ';' ; 如果我没理解错的话,
为 C 的一个子集编写一个简单的 BNF 语法,它支持多个语句,包括赋值、if-else 和没有 block 语句的 while 语句。为你的非终结符使用有意义的名字(相对于神秘的字母)。假设变量由单
我正在尝试为以下语法创建一个 LALR(1) 解析器并发现一些移位/归约冲突。 S := expr expr := lval | ID '[' expr ']' OF expr lval := ID
根据这个paper的规则: If A is the start nonterminal, put EOF in FOLLOW(A) Find the productions with A on the
为 k > 1 制作人工 LR(k) 文法很容易: Input: A1 B x Input: A2 B y (introduce reduce-reduce con
在使用 make 和 bison 的项目中,我很难指定编译语法 grammar.tab.c 依赖于语法输入 grammar.y,每个目标文件都依赖于相应的源文件(包括 grammar.tab.o),并
我正在尝试从语法分析树中提取乔姆斯基范式 (CNF) - 句子的语法产生式: (ROOT (S (NP (DT the) (NNS kids)) (VP (VBD opened)
我知道 ANTLR 可以接受 LL(*) 文法。但是,有没有办法使用 ANTLR 检查语法是否是 LL(1)? 最佳答案 options { k = 1; } 如果您的语法不在 LL(1) 中,
我还没有找到答案。是否存在无法转换为 LL(1) 的上下文无关且无歧义的语法? 我发现了一个我不知道如何转换为 LL(1) 的作品:parameter-type-list C99中的生产: param
我是一名优秀的程序员,十分优秀!