标签: glr

GLR解析算法资源

我正在编写一个GLR解析器生成器,并希望在互联网和死树种类(不熟悉极客说话的人的书籍)上提供有关此算法相关资源的建议.

我知道Bison可以生成GLR解析器,并且考虑到它在GPL下我可以检查它的代码,但是对它有一个完整的算法描述会很好.

那么,有没有人知道我可以利用的任何好资源?谢谢.

compiler-construction parsing parser-generator glr

23
推荐指数
3
解决办法
4450
查看次数

如何实现图形结构堆栈?

好的,所以我想制作一个GLR解析器生成器.我知道存在比我可能做的更好的程序,但我这样做是为了娱乐/学习,所以这并不重要.

我一直在阅读有关GLR解析的内容,我认为我现在对它有了很好的理解.但现在是时候开始做生意了.

图形结构堆栈(GSS)是用于GLR解析器的关键数据结构.从概念上讲,我知道GSS是如何工作的,但到目前为止我所看到的资料都没有解释如何实现GSS.我甚至没有支持的操作权威列表.有人能指出我为GSS提供一些好的示例代码/教程吗?谷歌到目前为止没有帮助.我希望这个问题不要太模糊.

stack parsing graph glr data-structures

12
推荐指数
2
解决办法
1579
查看次数

谁更快:PEG还是GLR?

我正在尝试lintC/AL编程语言创建某种工具.所以基本上我需要对源代码执行语法和词法分析.我打算从头开始编写解析器,但后来发现有很多工具可以帮助自动生成这些解析器.

我需要性能,因为在一个部分中检查20兆字节的代码是正常情况,我需要该工具可以通过自定义规则进行扩展.所以我决定使用JavaScript.

据我发现两个发生器我可以使用JisonPEG.js.

哪一个给我更多的解析性能?也许不是比较库,而是算法?

哪一个更适合我的需求(解析通用编程语言)?

更新: 我发现了类似的问答:

javascript performance peg parser-generator glr

6
推荐指数
2
解决办法
3860
查看次数

为什么“ int test {}”是C语言BNF中的函数定义

我对著名的Backus-Naur形式的C语法感兴趣并且研究了一段时间,令我感到困惑的是,某些语法在我看来错了,但根据BNF却被认为是正确的。

例如,int test {}这是什么?我认为这在C语言中是一种错误的语法,但事实是BNF认为这是一个函数定义:

int -> type_const -> type_spec -> decl_specs
test-> id -> direct_declarator -> declarator
'{' '}' -> compound_stat
decl_specs declarator compound_stat -> function_definition
Run Code Online (Sandbox Code Playgroud)

我用bison尝试过,它认为输入int test {}是正确的形式,但是我在C编译器上尝试过,它将无法编译。

所以有问题:

  1. int test {} 正确的语法吗?
  2. 如果语法正确,那是什么意思?为什么编译器无法识别它?
  3. 如果语法错误,我可以说BNF不严格吗?这是否意味着现代C编译器不坚持使用此BNF?

c parsing lalr bnf glr

6
推荐指数
1
解决办法
296
查看次数

Bison的C++ GLR解析器

我正在使用Bison来生成解析器.我有一个转变/减少冲突,我真的需要Bison使用GLR而不是LALR来处理它.但我已经通过了该%glr-parser指令,源文件仍然声明它是一个LALR解析器.我甚至发现了一个"glr.cc"骨架,它表明它是一个GLR C++解析器并且使用它%skeleton "glr.cc"并没有改变输出.Bison不会为所有目标语言提供所有算法吗?

bison glr

5
推荐指数
1
解决办法
1843
查看次数

Bison,C++ GLR 解析:如何强制移位\减少冲突?

如何强制通过 GLR 方法解决 shift\reduce 冲突?
假设我希望解析器为自己解决右移运算符和模板参数的两个右尖括号之间的冲突。我让词法分析器将 2 个连续的“>”符号作为单独的标记传递,而不将它们合并为一个“>>”标记。然后我将这些规则放在语法中:

operator_name:  
     "operator" ">"  
   | "operator" ">" ">"  
;  
Run Code Online (Sandbox Code Playgroud)

我希望这是一个转变\减少冲突。如果我有具有左结合性的 ">" 的标记声明,则不会发生冲突。所以我必须删除标记优先级\关联性声明,但这会导致许多其他冲突,我不想通过为每个冲突规则指定上下文优先级来手动解决这些冲突。那么,有没有办法在声明令牌的同时强制转换\减少冲突?

c++ bison glr

5
推荐指数
1
解决办法
1312
查看次数

为什么这个非常简单的语法会导致 GLR 解析器卡住?

我尝试了几种不同的解析器生成器(Bison、DParser 等),它们声称能够生成 GLR 解析器,即可以处理不明确的语法的解析器。这是我正在讨论的类型的一个非常简单的二义性语法:

START: A | B;
A: C | D;
B: C | D;
C: T1 | T2;
D: T3 | T4;
T1: 't1';
T2: 't2';
T3: 't3';
T4: 't4';
Run Code Online (Sandbox Code Playgroud)

我可以很好地生成解析器,但是当我提供应该有效的解析器输入时,我会遇到“未解决的歧义”错误或直接崩溃。当我将语法更改为明确的版本时,不会出现任何类型的问题。

我对 GLR 解析器有什么不理解的地方?我认为重点是,在歧义的情况下,所有可能的解析都会被跟踪,直到它们合并或到达死胡同。我所需要的只是一个解析器,它可以告诉我输入是否有任何有效的解析。

谢谢你的帮助。

编辑:

这令人沮丧。使用 %dprec 和 %merge 我已经能够让 Bison 处理不明确的规则和终端,但它仍然对我需要处理的那种非常简单但高度病态的伪英语语法感到窒息:

S: NP VP | NPA VP;
NPA: D N | NP PP;
NP: D N | NP PP | NPA;
VP: V NP | VP PP;
PP: P NP;
D: "the" | "a";
P: "in" …
Run Code Online (Sandbox Code Playgroud)

grammar parsing ambiguity bison glr

5
推荐指数
1
解决办法
1425
查看次数