问题标签 [bnfc]

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 投票
1 回答
488 浏览

parsing - BNFC 解析器和括号 Mathematica 类语法

我在BNF 转换器上玩了一会儿,并尝试重新设计Mathematica语言的某些部分。我的 BNF 已经有大约 150 行并且运行良好,直到我注意到一个非常基本的错误。Mathematica中的括号[]用于两种不同的事物

  1. expr[arg]调用函数
  2. list[[spec]]访问表达式的元素,例如 aList

假设我想为一种只包含标识符、函数调用、元素访问和表达式序列作为参数的语言创建解析器。这些表格将是有效的

BNFC 的直接但明显错误的输入文件可能看起来像

此 BNF 不适用于第一个代码块的最后两个示例。

问题似乎位于创建的Yylex词法分析器文件中,该文件匹配]并且]]分开。这是错误的,因为从最后一个例子可以看出,它是关闭]还是]]取决于上下文。因此,要么您必须创建一堆大括号以确保正确匹配,要么将其留给解析器。

有人可以告诉我是否可以通过 BNFC 实现这一点?

(顺便说一句,其他提示也将不胜感激)

0 投票
1 回答
78 浏览

bnf - bnf 转换器中的拟合顺序

我对 bnf 转换器中的规则优先级有疑问。这里我复制一些规则

我写了一个示例程序:

结果,我希望 p(i) 将被转换为 CParams [VarCParam (Ident "i")],但它被转换为 CParams [BExpCParam (BVar (Ident "i"))]。

你能告诉如何更改规则以修复此错误吗

0 投票
2 回答
249 浏览

grammar - 在 BNFC 语法中设置优先级

背景:

我正在学习软件语义方面的课程,我们应该为一种名为while的玩具语言创建一个小型编译器和运行时。我们得到了 Java 的代码框架,但我们可以使用任何我们想要的语言。我认为这是一个排练语法的机会,并认为用 C++ 进行实验会很酷。

现在,我在为我的语句设置优先规则时遇到了一些问题。这是我现在的BNFC语法文件:

我想要的是输入

根据我的复合规则解析成类似的东西

也就是说,我希望分配不是循环体的一部分。但是,我得到的是

如您所见,while 循环的主体由复合语句组成,这不是我想要的。我应该如何设置我的优先规则来达到这个效果?

0 投票
1 回答
286 浏览

regex - 有没有办法在 BNFC 中使用空格?

如何在BNFC定义中使用空格?

例如,假设我想为 lambda 演算生成一个解析器,其中允许抽象变量列表:

“显而易见”的事情是使用标记规则,例如:

但是,BNFC 默认剥离空白,因此不起作用。起作用的是使用逗号分隔符。有点丑,但我可以忍受它......仍然能够通过空间分开很好。

BNFC 中是否有空白字符类?

0 投票
0 回答
314 浏览

compiler-construction - BNFC 中用于语法定向翻译的内部规则?

BNFC 允许使用“内部”规则来帮助进行语法定向翻译。他们给出的典型例子是类型注释

这为我们提供了 AST 的新部分,

这很好用!但是,如果可以允许将任意类型作为占位符放在那里以供以后使用,那将是非常好的。

我们将生成一个参数数据类型

然后我们可以用类型(用于类型检查器)或代码段(用于代码生成)填充它。

0 投票
1 回答
555 浏览

java - 如何逐步使用java_cup?

我对 java_cup 和解析完全陌生,我想使用 bnfc 和 javacup 为简单的语法生成解析器。我已经指定了语法规则并使用了 bnfc:

这为我生成了一些文件(ia filename.cup)

然后我尝试用 java_cup 构建它:

这也成功结束。最后我得到了文件 parser.java 和 sym.java。

我有一些输入文件,我想检查它们是否解析。我不知道如何使用这个生成的解析器。我还编译了 parser.java 但是当我尝试运行它时,它抛出

0 投票
1 回答
405 浏览

haskell - cabal 安装 bnfc 缺少的目录

我是 Haskell 的新手,正在尝试为编译器构造类编写程序。

我在我的 ubuntu 13.10 上安装了 haskell-platform 包,然后(在安装 haskell 平台后没有搞乱任何东西)尝试运行以下命令:

结果是:

当我尝试安装包目录时,它说包已经安装。任何人都可以帮忙吗?

0 投票
1 回答
47 浏览

parsing - 如何禁用内置规则?

如何禁用所有 BNFC 内置规则,例如IdentInteger或用于分隔令牌的空格?

我发现它们无用烦人,因为它们会干扰我正在尝试编写的解析器。

我已经尝试重新定义它们,但词法分析器似乎继续为它们生成规则。我可以从生成的文件中手动删除它们,但我完全反对修改机器生成的代码。


关于他们为什么烦人的长版本。

我刚刚开始学习如何使用 BNFC。我尝试的第一件事是将我以前的工作从 Alex 转换为 BNFC。特别是我想只匹配“好”的罗马数字。我认为这很简单:罗马数字可以看作是一个序列

他们不可能都是空的。所以一个数字要么有一个非空的thousand-part,并且可以是其余的任何东西,要么它有一个空的thousand-part,因此要么hundred-tens-要么unit- part必须是非空的。可以重复相同的事情直到单位的基本情况。

所以我想出了这个,这或多或少是我在 Alex 中所做的直接翻译:

现在,问题是如果我尝试构建这个解析器,当给出如下输入时:

或者一般来说,如果一个数字有多个*-parts 不为空,则解析器会给出错误,因为 BNFC 无法MMI与单个令牌匹配,因此它使用内置Ident规则。由于该规则未出现在语法中,因此会引发解析错误,尽管输入字符串在我定义的语法中完全没问题,但这是一个伪造 Ident的规则。

注意:我验证了如果我用空格分隔不同的部分,我会得到正确的输入,但稍后我想用空格分隔整数,而不是它们的标记。

0 投票
1 回答
100 浏览

reference-manual - 在哪里可以找到 bnfc 的参考手册?

我找不到 bnfc 的手册页。在bnfc的主页上没有指向手册页的链接。

我知道的唯一选项是-m用于生成 make 文件;但是这方面的知识,我是从bnfc主页上的教程中学到的。

我正在搜索的是仅生成词法分析器文件和解析器文件的选项。我不需要文档文件。

0 投票
1 回答
3971 浏览

c++ - 一个简单的 C++ 程序示例的 BNF 语法

所以我正在尝试为一个简单的 c++ 程序编写语法。

这就是语法现在的样子:

这是需要解析的简单c++程序

所以当我尝试解析它时,我在第 6 行得到错误,意思是 std::cout 行。由于我是 bnf 的新手,我不知道如何“思考”来解决这个问题。如果有人可以举例说明您将如何解决这种情况,那就太好了。!

谢谢!