问题标签 [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.
parsing - 禁止 BNFC 语法中不必要的最外层括号
这是这个的延续我之前提出的关于命题逻辑的 BNFC 语法的问题根据定义,我让它使用括号工作,但我现在想扩展语法以在没有括号的情况下工作,但是有一个问题:不允许不必要的外括号。
例如,原子语句a
应该被允许,但(a)
不应该被识别。该句子(a => b) & c
也应该允许,但不允许((a => b) & c)
,等等。最后一个例子强调了括号的必要性。优先级是
- 等价
<=>
和暗示=>
, - 连词
&
与析取|
- 否定
-
和 - 原子。
级别越高,越早被解析。
通过递归为不同的运算符设置优先级,我得到了使用不必要的括号的语法:
现在的问题是,我如何不允许外括号,其中的允许是由最后一条规则引起的L3 ::= "(" L ")";
?在表达式中允许括号是绝对必要的,但它也允许在边缘使用括号。我想我需要一些额外的规则来消除歧义,但这会是什么样子?
这个语法也会导致大约 6 个减少/减少冲突,但在递归定义中这些冲突不是不可避免的吗?
bnfc - BNFC 不解析单个函数
我有以下 BNFC 代码:
但是,以下未解析
fun(X)
当它解析下面的
x # fun(Y)
总而言之,它将函数解析为约束的一部分,但不是单独解析。它应该解析它们。
谁能指出为什么?
logic - 逻辑编程语言中的类型如何使用 BNFC 实现?
我一直致力于使用 BNFC 实现逻辑编程语言。我遇到的问题与打字规则有关。在 A.Ranta 的“实现编程语言”一书中,类型包含在 LBNF 语法中,如
我知道对于像 C 语言这样的语法,添加类型很重要,因为它们在声明中是不可或缺的,因此需要由前端解析。在本书中,类型检查器是用 Haskell 或 Java 编写的。但是在逻辑 PL 中,类型不是那么明确,它们是单独声明的,类型的示例语法编码为:
所以问题是类型的语法在代码中的什么位置?每当我尝试在 BNFC 中添加类型时,它就没有多大意义,并且测试的输入无法正确解析。这本书有一个很好的 C 语法示例,但没有提供 BNFC 创建的前端和类型检查器如何连接、信息如何从一个到另一个传递等的完整图片。
grammar - 如何在 lbnf / bnfc 语法中调试“X 没有生产”?
在玩 lbnf/bnfc 时,在某些情况下,我希望它可以选择允许复数形式。然而,它总是说“规则中出现'复数'没有生产”,我不明白为什么。下面的相关行。SomeOther 和 SomeToken 基本上是字符串。
HeadAuthors. Authors::= "AUTHOR" [Plural] ":" SomeOther SomeToken ;
Plural. Plural::= "S" ;
c++ - 使用 LBNF Grammar for C++ 解析程序的问题
我正在尝试修改此语法以能够解析 C++ 程序,并且它的 using 语句出现问题,引发错误syntax error at line 10 before using std::cin ; using
有问题的程序:
我不确定为什么它不能识别“using”关键字,因为我在语法中将它定义为 SUsing。非常感谢任何和所有帮助。谢谢!
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)
.
Can I free the source buffer referred by
char *str
parameter immediately afterpsProc
returns? I guess the returnedProc
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?How should I free the returned
Proc
? The returnedProc
is a pointer toProc_
, and it makes up an Abstract Syntax Tree by pointers. I only need callfree()
once on the returned pointer to free up, right?Within the method body of
Proc psProc(const char *str)
, it returns a pointer stored in global variableYY_RESULT_Proc_
. Does that mean I must not callpsProc
concurrently from different threads?
c++ - 使用 bnfc 创建 C++ 解析器
所以我目前正在为 C++ 的一个子集构建一个解析器。到目前为止,我的语法生成的解析器:
这能够解析以下简单的 hello world 程序:
只有 2 个班次/减少冲突,我很高兴
不,我更进一步,想尝试解析这个程序
由于第 11 行,这显然不起作用,但我想添加:
会解决这个问题,但它没有,我不知道为什么。它实际上是如何工作的?
c++ - 用于类似 C/C++ 的语言的类型检查器
目前我正在为类似 C/C++ 的语言开发一个编译器,以便更具体地作为类型检查器。我已经生成了一个带有语法和 bnfc 工具的解析器。对于我的类型检查器,我需要推断表达式的类型。所有表达式都派生自抽象基类 Exp,如下所示:
ExpPlus 分别是指Exp + Exp
和 ExpAnd to Exp && Exp
。我的推断函数接受一个表达式并返回它的类型,如下所示:
正如你所看到的,我有一长串 If 语句,用于检查表达式是哪种具体表达式类型,它工作得很好,但我想知道是否有更优雅的方式来做到这一点。
bnf - 将 BNF 转换为 EBNF(Backus-Naur 形式到扩展的 Backus-Naur 形式)
我需要从 BNF 转换为 EBNF。但我不明白如何处理,在这一行:
haskell - 如何解决haskell堆栈中不匹配的模块名称
我生成了一些名为Par.hs
的haskell 模块Bnfc/Par.hs
生成的模块是
在我的图书馆引用这是
我package.yaml
的 withstack
是这样配置的
但是我在运行时遇到上述错误stack ghci
。我不明白我做错了什么?