2
  • 我想将空格和换行符视为普通空格。
  • 我想将换行符与其他空格区分开来,以允许特殊情况。

第一次尝试编写合规语法失败。

这是语法:

! ------------------------------------------------- Sets

{WS}           = {Whitespace} - {CR} - {LF}
{ID Head}      = {Letter} + [_]
{ID Tail}      = {Alphanumeric} + [_]
{String Chars} = {Printable} + {HT} - ["\]

! ------------------------------------------------- Terminals

! The following defines the Whitespace terminal using the {WS}
! set - which excludes the carriage return and line feed 
! characters

Whitespace    = {WS}+ | {CR}{LF} | {CR} | {LF}
!NewLine       = {CR}{LF} | {CR} | {LF}
MyNewLine      = {CR}{LF} | {CR} | {LF}
4

3 回答 3

5

它们是模棱两可的,因为它们都包含相同的子集{CR}{LF} | {CR} | {LF}

给定输入{CR}{LF},解析器无法判断它应该匹配哪个终端。

表驱动的解析器并不是真正设计用来直接处理“特殊情况”的。如果您想在某些情况下忽略换行符,但在其他情况下将含义赋予它们,那么您必须在您的归约中处理它(即分别标记换行符,并在您的归约中丢弃它们),但这会变得丑陋.

一个(可能)更好的解决方案是使用标记器状态(可能由解析器控制)来更改换行符输入的标记方式。不完全理解你的语法很难说。另外,我已经有几年没有搞砸这些东西了。

于 2009-03-01T07:49:41.443 回答
4

我认为语法是模棱两可的,因为 Whitespace 和 MyNewLine 都匹配换行符。由于它会按照您的方式进行操作,因此我建议分别检测空格和换行符,并根据具体情况决定如何处理换行符。

我在该领域没有太多经验,但这就是我在计算理论课和编译器设计课上所记得的。

我希望这有帮助。

于 2009-03-01T07:21:31.137 回答
0

一个迟到的答案。

令我沮丧的是,我只是一个大器晚成的 ;-) 成员。

继续使用通常的基于行的语法声明

! ====================================================================
{Whitespace Ch} = {Whitespace} - {CR} - {LF}

Whitespace = {Whitespace Ch}+
Newline    = {CR}{LF} | {CR} | {LF}
! ====================================================================

空格和换行的区别已经被考虑在内了!

在编写生产规则时考虑解决您的特殊情况。

对于复杂的情况,您甚至可能需要定义一些虚拟终端(高级技术)。

您可以详细说明您的语法并通过再次发布来询问。

最后编辑:如果您已经解决了这个问题,请分享。谢谢。

于 2011-12-07T06:21:08.270 回答