问题标签 [grammar]

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.

0 投票
4 回答
2291 浏览

parsing - 使用 Happy (Haskell) 从 yacc 语法生成 Fortran 77 解析器

我偶然发现了以下 F77 yacc 语法:http: //yaxx.cvs.sourceforge.net/viewvc/yaxx/yaxx/fortran/fortran.y ?revision=1.3&view=markup 。

如何使用Happy从此文件中制作 Fortran 77 解析器?

为什么会有一些 C?/C++?那个 .y 文件中的代码?

更新:感谢您的回复!

一段时间以来,我一直在使用两种新方法:

  1. 从与标题为Parametric Fortran的论文捆绑的源代码包中提取和修改解析器,
  2. 在BNFC的帮助下从头开始编写语法。

我已经可以解析简单的代码摘录了。如果本世纪内出现可用的东西,我会让人们知道的^__^“呵呵。

P/S:想看看我是否可以自己收集足够的动力来启动一个自动差异化引擎的项目,以取代我们暂时依赖的仅二进制引擎。初始阶段的娱乐:我在看Love Shuffle!这是一部非常有趣的J-Drama!强烈推荐...

0 投票
1 回答
28692 浏览

parsing - LL和递归下降解析器之间的区别?

我最近试图自学解析器(用于语言/上下文无关语法)是如何工作的,除了一件事之外,其中大部分似乎都是有意义的。我特别关注LL(k) 语法,其中两个主要算法似乎是LL 解析器(使用堆栈/解析表)和递归下降解析器(仅使用递归)。

据我所知,递归下降算法适用于所有 LL(k) 语法,甚至可能更多,而 LL 解析器适用于所有 LL(k) 语法。然而,递归下降解析器显然比 LL 解析器要简单得多(就像 LL 解析器比 LR 解析器更简单一样)。

所以我的问题是,使用任何一种算法时可能会遇到哪些优势/问题?为什么有人会选择 LL 而不是递归下降,因为它适用于同一组语法并且实现起来更棘手?

0 投票
4 回答
15138 浏览

php - 开源语法检查器

对于我正在从事的在线项目,我正在寻找一个开源语法检查器。我搜索了谷歌,结果很好(http://www.link.cs.cmu.edu/link/等),但我想知道你们对这个话题有什么看法。

我需要它能够在线使用,而不是基于桌面,但这是我唯一真正的规范。如果它有一个内置的拼写检查器,那将是一个加号,但我总是可以为此目的使用另一个项目。

谢谢你的帮助。

0 投票
3 回答
1572 浏览

antlr - 如何在 ANTLR 中构建一个干净的、类似于 Python 的语法?

天!

如何构建一个简单的 ANTLR 语法来处理多行表达式而不需要分号或反斜杠?

我正在尝试为表达式编写一个简单的 DSL:

总的来说,我希望我的应用程序为脚本提供一些初始命名值并提取最终结果。但是,我对语法很感兴趣。我想支持多行表达式,如下所示:

我从这样的 ANTLR 语法开始:

看起来很简单,但我已经遇到了换行的麻烦:

以图形方式,在 org.antlr.works.IDE 中:

决策可以使用多种选择匹配 NL http://img.skitch.com/20090723-ghpss46833si9f9ebk48x28b82.png

我已经踢了语法,但总是以违反预期行为而告终:

  • 文件末尾不需要换行符
  • 空行是可以接受的
  • 从井号开始的一行中的所有内容都被丢弃为注释
  • 作业以换行符结尾,而不是分号
  • 如果用括号括起来,表达式可以跨越多行

我可以找到具有许多这些特征的示例 ANTLR 语法。我发现当我削减它们以将它们的表现力限制在我需要的范围内时,我最终会破坏某些东西。其他的太简单了,我在添加表现力的同时打破它们。

我应该从哪个角度来理解这个语法?你能指出任何不是琐碎或完整的图灵完备语言的例子吗?

0 投票
1 回答
695 浏览

git - 用于确定时态的 CLI 语法检查器

我喜欢在我的 Git 日志中使用现在时(例如,“添加功能”而不是“添加功能”)。目前,如果日志消息的第一个单词以“ed”结尾,我有一个非常天真的 Git 钩子会中止提交,但我想要一个更健壮的解决方案(其中“更健壮”意味着“不完全蹩脚”)。是否有语法检查器可以让我按照以下方式编写脚本:

我不需要完美的解决方案,只需要比匹配 /^\w*ed\W/ 更好的解决方案。

0 投票
2 回答
246 浏览

image - 什么程序生成语法图?

我在SQLiteJSON的网站上看到了语法图。什么程序可以用来生成这些漂亮的图片?

0 投票
4 回答
2146 浏览

c++ - 接受 C++ 中的语法

这是我坚持的实验室任务。

我需要接受这个语法(ab)*b,它基本上意味着任意数量的“ab”并以 b 结尾。

我已经编写了这段代码,但不知何故,它只检查前 2 个字母。

0 投票
4 回答
433 浏览

perl - 为什么我不能分配@b || 在 Perl 中 @c 到 @a?

我想执行一些复杂的@a = @b || @c赋值变化,目的是@b如果非空(因此在布尔意义上是真的),@c否则。文档明确告诉我我不能。(事实也是如此!)

“||”、“//”和“&&”运算符返回最后计算的值(与 C 的“||”和“&&”不同,它们返回 0 或 1)。

[...]

特别是,这意味着您不应该使用它在两个聚合之间进行选择以进行分配:

不幸的是,它并没有真正告诉我为什么。

我预期会发生的是:

  • @a =是一个数组赋值,在右侧引入列表上下文。
  • @b || @c是右侧,要在列表上下文中进行评估。
  • ||是 C 风格的短路逻辑或。它从左到右评估(如果需要)并传播上下文。
  • @b在列表上下文中进行评估。如果为真(非空),则返回。
  • 如果不是,@c也将在列表上下文中进行评估并返回。

显然,我的倒数第二个陈述是错误的。为什么?而且,更重要的是,文档或来源的哪一部分解释了这种行为?

PS:在问题的范围之外,我避免使用三元运算符的文档建议的原因是 my@b实际上是一个临时的(函数调用结果)。

0 投票
1 回答
464 浏览

parsing - Parser/Lexer 忽略不完整的语法规则

我有一个用 ocamlyacc 和 ocamllex 编写的解析器和词法分析器。如果要解析的文件过早结束,例如我忘记了行尾的分号,则应用程序不会引发语法错误。我意识到这是因为我正在提高和捕捉 EOF 并且这使得词法分析器忽略未完成的规则​​,但是我应该如何这样做来引发语法错误?

这是我当前的解析器(简化),

和lexxer(简化),

示例输入文件,

一种解决方案是,在命令规则的末尾添加一个递归调用给自身,并添加一个空规则,所有这些都构建一个列表以返回主程序。我想我可能将 Eof 解释为期望和结束条件,而不是词法分析器中的错误,这是正确的吗?

0 投票
3 回答
8389 浏览

antlr - ANTLR 表达式语法

我正在尝试实现表达式处理语法(处理嵌套括号和东西)。到目前为止,我有以下内容,但他们无法处理某些情况(成功/失败情况出现在以下代码块之后)。有谁知道发生了什么?

注意:varname +=varname = stuff 只是 XText 中一些额外的 AST 生成助手。暂时不用担心他们。

这是解析/失败的列表: