问题标签 [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 回答
78 浏览

parsing - 禁止 BNFC 语法中不必要的最外层括号

这是这个的延续我之前提出的关于命题逻辑的 BNFC 语法的问题根据定义,我让它使用括号工作,但我现在想扩展语法以在没有括号的情况下工作,但是有一个问题:不允许不必要的外括号。

例如,原子语句a应该被允许,但(a)不应该被识别。该句子(a => b) & c也应该允许,但不允许((a => b) & c),等等。最后一个例子强调了括号的必要性。优先级是

  1. 等价<=>和暗示=>
  2. 连词&与析取|
  3. 否定-
  4. 原子。

级别越高,越早被解析。

通过递归为不同的运算符设置优先级,我得到了使用不必要的括号的语法:

现在的问题是,我如何不允许外括号,其中的允许是由最后一条规则引起的L3 ::= "(" L ")";?在表达式中允许括号是绝对必要的,但它也允许在边缘使用括号。我想我需要一些额外的规则来消除歧义,但这会是什么样子?

这个语法也会导致大约 6 个减少/减少冲突,但在递归定义中这些冲突不是不可避免的吗?

0 投票
1 回答
17 浏览

bnfc - BNFC 不解析单个函数

我有以下 BNFC 代码:

但是,以下未解析

fun(X)

当它解析下面的

x # fun(Y)

总而言之,它将函数解析为约束的一部分,但不是单独解析。它应该解析它们。

谁能指出为什么?

0 投票
1 回答
23 浏览

logic - 逻辑编程语言中的类型如何使用 BNFC 实现?

我一直致力于使用 BNFC 实现逻辑编程语言。我遇到的问题与打字规则有关。在 A.Ranta 的“实现编程语言”一书中,类型包含在 LBNF 语法中,如

我知道对于像 C 语言这样的语法,添加类型很重要,因为它们在声明中是不可或缺的,因此需要由前端解析。在本书中,类型检查器是用 Haskell 或 Java 编写的。但是在逻辑 PL 中,类型不是那么明确,它们是单独声明的,类型的示例语法编码为:

所以问题是类型的语法在代码中的什么位置?每当我尝试在 BNFC 中添加类型时,它就没有多大意义,并且测试的输入无法正确解析。这本书有一个很好的 C 语法示例,但没有提供 BNFC 创建的前端和类型检查器如何连接、信息如何从一个到另一个传递等的完整图片。

0 投票
1 回答
64 浏览

grammar - 如何在 lbnf / bnfc 语法中调试“X 没有生产”?

在玩 lbnf/bnfc 时,在某些情况下,我希望它可以选择允许复数形式。然而,它总是说“规则中出现'复数'没有生产”,我不明白为什么。下面的相关行。SomeOther 和 SomeToken 基本上是字符串。

HeadAuthors. Authors::= "AUTHOR" [Plural] ":" SomeOther SomeToken ;

Plural. Plural::= "S" ;

0 投票
1 回答
81 浏览

c++ - 使用 LBNF Grammar for C++ 解析程序的问题

我正在尝试修改此语法以能够解析 C++ 程序,并且它的 using 语句出现问题,引发错误syntax error at line 10 before using std::cin ; using

有问题的程序:

我不确定为什么它不能识别“using”关键字,因为我在语法中将它定义为 SUsing。非常感谢任何和所有帮助。谢谢!

0 投票
1 回答
50 浏览

bison - memory management in C parser generated by BNFC

I use BNFC to generate parser bnfc -m -c ./mylang.cf. Internally, BNFC makefile calls bison to generate C parser.

I can successfully parse source code by calling the generated psProc method below.

I have a few questions regarding Proc psProc(const char *str).

  1. Can I free the source buffer referred by char *str parameter immediately after psProc returns? I guess the returned Proc may contain pointers referring to the input source buffer, So I should ensure the lifetime of source buffer to be longer than the returned pointer. is that correct?

  2. How should I free the returned Proc? The returned Proc is a pointer to Proc_, and it makes up an Abstract Syntax Tree by pointers. I only need call free() once on the returned pointer to free up, right?

  3. Within the method body of Proc psProc(const char *str), it returns a pointer stored in global variable YY_RESULT_Proc_. Does that mean I must not call psProc concurrently from different threads?

0 投票
0 回答
69 浏览

c++ - 使用 bnfc 创建 C++ 解析器

所以我目前正在为 C++ 的一个子集构建一个解析器。到目前为止,我的语法生成的解析器:

这能够解析以下简单的 hello world 程序:

只有 2 个班次/减少冲突,我很高兴

不,我更进一步,想尝试解析这个程序

由于第 11 行,这显然不起作用,但我想添加:

会解决这个问题,但它没有,我不知道为什么。它实际上是如何工作的?

0 投票
1 回答
86 浏览

c++ - 用于类似 C/C++ 的语言的类型检查器

目前我正在为类似 C/C++ 的语言开发一个编译器,以便更具体地作为类型检查器。我已经生成了一个带有语法和 bnfc 工具的解析器。对于我的类型检查器,我需要推断表达式的类型。所有表达式都派生自抽象基类 Exp,如下所示:

ExpPlus 分别是指Exp + Exp和 ExpAnd to Exp && Exp。我的推断函数接受一个表达式并返回它的类型,如下所示:

正如你所看到的,我有一长串 If 语句,用于检查表达式是哪种具体表达式类型,它工作得很好,但我想知道是否有更优雅的方式来做到这一点。

0 投票
0 回答
40 浏览

bnf - 将 BNF 转换为 EBNF(Backus-Naur 形式到扩展的 Backus-Naur 形式)

我需要从 BNF 转换为 EBNF。但我不明白如何处理,在这一行:

0 投票
1 回答
50 浏览

haskell - 如何解决haskell堆栈中不匹配的模块名称

我生成了一些名为Par.hs的haskell 模块Bnfc/Par.hs

生成的模块是

在我的图书馆引用这是

package.yaml的 withstack是这样配置的

但是我在运行时遇到上述错误stack ghci。我不明白我做错了什么?