问题标签 [ebnf]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java 注释的语法
是否有描述 Java 注释语法的 BNF 或 EBNF?
grammar - 使用 EBNF 或 BNF 编写递归下降解析器更容易吗?
我有一个用于语法的 BNF 和 EBNF。BNF 显然更冗长。就使用 BNF 构建递归下降解析器而言,我有一个相当不错的主意;有很多资源。我无法找到将 EBNF 转换为递归下降解析器的资源。是因为难度更大吗?我记得在我的 CS 理论课程中,我们学习了 EBNF,但我们没有将它们转换为递归下降解析器。我们确实将 BNF 转换为递归下降解析器。
我问的原因是因为 EBNF 更紧凑。
从总体上看 EBNF,我注意到包含在{
和之间的术语}
可以转换为while
循环。是否有其他指导方针或规则?
syntax - BNF vs EBNF vs ABNF:选择哪个?
我想提出一种语言语法。我已经阅读了一些关于这三个的内容,并且看不到任何一个人能做到而另一个人不能做到的事情。有什么理由使用一个而不是另一个?还是只是偏好问题?
parsing - 如何处理 EBNF 语法中不同标记中的重叠字符组?
我正在使用 LL(k) EBNF 语法来解析字符流。我需要三种不同类型的令牌:
前两个标记声明很好,因为它们不共享任何公共字符。
但是,第三个 ,message
是无效的,因为某些字符串可能同时是num
and message
(例如"123"
),而其他字符串可能既是 anident
又是 a message
(例如"Hello"
)。因此,分词器无法正确区分。
另一个例子是区分整数和实数。除非您要求所有实数至少有一位小数(意味着 1 需要编码为 1.0,这对我来说不是一个选项),否则我无法在语法中获得这两个数字之间差异的支持类型。我必须将所有值都表示为实数并在该点之后进行检查。这很好,但不是最理想的。我真正的问题是message
令牌。我找不到解决方法。
所以问题是,我可以用 LL(k) EBNF 语法来做到这一点吗?我正在使用CoCo/R来生成解析器和扫描器。
如果我不能用 LL(k) EBNF 做到这一点,那么我还可以考虑哪些其他选择?
编辑这是我从 CoCo/R 得到的输出:
language-agnostic - Turbo Pascal 的 BNF / EBNF(最好是 5.5 或更高版本,因为 OOP)?
你们有谁知道 Turbo Pascal 的 BNF 或 EBNF 是否在某处可用(合法!!)?
lexer - 为什么 ANTLR 中的 'a'..'z' 匹配 $ 或 £ 等通配符
当我运行以下语法时:
我给输入“?test”为什么antlr接受这个作为有效输入?我认为 ('a'..'z') 只会匹配小写字母中的字符?
antlr - ANTLR,如何在 ANTLR 中转换 BNF、EBNF 数据?
我必须生成 CSV 数据的解析器。不知何故,我设法为 CSV 数据编写了 BNF、EBNF,但我不知道如何将其转换为 ANTLR 语法(这是一个解析器生成器)。例如,在 EBNF 中,我们编写:
但是当我在 ANTLR 中编写它来生成解析器时,它给出了一个错误并且不带括号。我不是ANTLR专家,有人可以帮忙吗?
scala - 递归 bnf 的 Scala Parser Combinators 技巧?
我试图匹配这个语法:
我的 scala packrat 解析器组合器如下所示:
但这不起作用。要么它“匹配贪婪”并告诉我:
或者如果我将其更改|
为 a|||
我会得到一个 stackoverflow:
我有点理解为什么会出现错误;我能做些什么来解析像上面这样的语法?对我来说似乎并不深奥
编辑:基于http://scala-programming-language.1934581.n4.nabble.com/Packrat-parser-guidance-td1956908.html中引用的论文, 我发现我的程序实际上并没有使用新的 packrat 解析器。
IE。更改Parser[Any]
为PackratParser[Any]
并使用lazy val
而不是def
我将上面的内容重写为:
python - 为类似markdown的语言实现解析器
我有类似于 markdown 和 SO 使用的标记语言。
旧版解析器基于正则表达式,维护起来完全是一场噩梦,因此我提出了自己的基于 EBNF 语法的解决方案,并通过 mxTextTools/SimpleParse 实现。
但是,一些可能相互包含的令牌存在问题,我看不出有一种“正确”的方法来做到这一点。
这是我的语法的一部分:
第一个问题是,扰流板、强和强调可以以任意顺序相互包含。以后我可能需要更多这样的内联标记。
我目前的解决方案只是为每个组合(inline_noast、inline_nostrong 等)创建单独的标记,但显然,随着标记元素数量的增加,此类组合的数量增长过快。
第二个问题是,这些强/强调的前瞻在某些不良标记__._.__*__.__...___._.____.__**___***
(如大量随机放置的标记符号)的情况下表现非常糟糕。解析几 kb 的此类随机文本需要几分钟时间。
我的语法有问题还是我应该使用其他类型的解析器来完成这项任务?