0

Higuys,我想使用 Byacc 解析文本。文本由空格和换行清楚地构成。您如何看待这些规则来解析一个文本?

text: /* empty string */ {$$ = "";} 
      |TEXT {$$ = $1;}
      |TEXT whitespace text {$$ = $1 + $2  + $3;}
      |TEXT line whitespace text {$$ = $1 + $2 + $4;}

记号 TEXT 在 Jflex 文件中,它代表一个单词。其他两个规则,空白和行已关闭:

line : NL { $$ = System.lineSeparator(); }
      | line NL { $$ = $1 + System.lineSeparator(); }


 whitespace: WHITESPACE {$$ = " ";}
          |whitespace WHITESPACE {$$ = $1 + " ";}

我的“文本”规则错了吗?塔克斯

4

1 回答 1

2

没有规则本身是“错误的”,规则就是这样。问题是,它做你想做的事吗?那你想让它做什么?你想用你的解析器接受什么,你想拒绝什么作为语法错误?

您的text规则是右递归的,因此需要大量的解析器堆栈空间(您会将整个输入推入堆栈,然后从右向左减少)。左递归会更好,但如果您出于某种原因需要从右到左进行减少,右递归就可以了。您的操作中似乎没有任何内容需要从右到左减少,因为它们所做的只是字符串连接,它们是关联的。

您的text规则不允许NL立即跟随TEXT(或 eof) - 必须有whitespaceafter line。如果这就是你想要的,那很好。

如果不是您的起始字符串(例如,如果您有另一个规则,例如) ,则text匹配一个空字符串可能会导致冲突。textinput: text line | input text line;

于 2014-05-16T19:09:30.880 回答