22、深入解析GLR与C++解析器技术

深入解析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解析器遇到冲突时,会概念性地分裂并并行继续两种可能的解析。当有多个冲突时,会创建部分解析的树,每次遇到冲突都会分裂。

1.5 语法明确和模糊时的处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值