深入解析GLR与C++解析器技术
1. GLR解析概述
1.1 解析器生成器的可靠性
像yacc和bison这样的解析器生成器广受欢迎,原因在于它们创建的解析器比手写解析器更可靠。当将无冲突的语法输入给bison时,生成的解析器所接受的语言与语法描述的完全一致,不会出现手写解析器常见的漏洞,尤其是在诊断错误输入时。若谨慎使用优先级声明来解决已知情况下的冲突,如表达式语法和if/then/else语句,就能确保解析器按预期处理语言。
1.2 GLR解析的特点与风险
GLR解析允许将任何语法交给bison,它会创建一个解析器来解析内容,并在解析时解决冲突。然而,冲突越多,解析的语言越可能不是预期的语言,解析器解决冲突的方式也可能不符合预期。在切换到GLR解析之前,必须明确语法冲突的原因以及解决方法,否则可能会遇到解析器在意外冲突时意外放弃,或者因错误的冲突解决导致解析的语言与预期不符的尴尬情况。
1.3 GLR解析的性能问题
理论上,GLR解析器可能非常慢,因为并行运行N个解析的速度大约是单个解析的N倍,特别是在语法高度模糊的情况下,每个标记都可能导致解析分支。不过,有用的GLR语法通常只有少数模糊性,并且能在几个标记内解决,因此性能通常是足够的。
1.4 GLR解析器处理冲突的方式
普通的bison LALR解析器在构建时就解决了所有冲突,因此无需处理移进/归约或归约/归约冲突。而GLR解析器遇到冲突时,会概念性地分裂并并行继续两种可能的解析。当有多个冲突时,会创建部分解析的树,每次遇到冲突都会分裂。
超级会员免费看
订阅专栏 解锁全文
3805

被折叠的 条评论
为什么被折叠?



