我正在为一组 CFG 编写解析器。(注意:RHS 只能是大写字母)
/*忽略声明和其他东西,这是代码的主要部分*/
void
start():
{
}
{
(
<UPPER_CHAR>
<ARROW>
<STRING>
( <PIPE> <STRING> )*
)*
}
TOKEN:
{
<ARROW: "=>" >
|
<PIPE: "|">
|
<UPPER_CHAR: (["A"-"Z"])>
}
TOKEN: {<STRING: (<LETTER> | <DIGIT> | <SYMBOL>)+ > }
这显然错过了一些边缘情况,其中包括:
A => A | a | D E => e
那么我做错了什么?