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 + " ";}
我的"文本"规则错了吗?Thaks
没有规则本身是"错误的",规则就是它。问题是,它能做你想做的吗?那么你想让它做什么呢?你想用你的解析器接受什么,你想拒绝什么作为语法错误?
text
规则是右递归的,因此需要大量的解析器堆栈空间(将整个输入推送到堆栈上,然后从右向左减少(。左递归会更好,但如果出于某种原因需要从右到左进行约简,右递归也可以。在你的操作中,似乎没有什么需要从右到左的减少,因为它们所做的只是字符串连接,这是关联的。
您的text
规则不允许NL
紧接着TEXT
(或eof(——line
之后必须有whitespace
。如果这是你想要的,那也没关系。
如果text
不是您的起始字符串(例如,如果您有另一个类似input: text line | input text line;
的规则(,则使text
与空字符串匹配可能会导致冲突。