我正在为一个小项目开发一个简单的示例解析器/词法分析器,但我遇到了一个问题。
我正在按照以下方式解析内容:
Name SEP Gender SEP Birthday
Name SEP Gender SEP Birthday
... 、 或空格中的任何SEP
一个(但不是多个!)在哪里。|
,
现在,我不想将字段顺序锁定在词法分析器顺序中,因此我尝试使用一组非常简单的标记来对此进行词法分析:
%token <string> SEP
%token <string> VAL
%token NL
%token EOF
现在,如果gender
字段不包含一小组预先确定的值,例如{male,female,neither,unspecified}
. 我可以包装解析器并处理这个问题,但我真的很想将此要求编码到自动机中以供将来扩展。
我的第一次尝试,看起来像这样,可怕地失败了:
doc:
| EOF { [] }
| it = rev_records { it }
;
rev_records:
| (* base-case: empty *) { [] }
| rest = rev_records; record; NL { record :: rest }
| rest = rev_records; record; EOF { record :: rest }
;
record:
last_name = name_field; SEP; first_name = name_field; SEP;
gender = gender_field; SEP; favourite_colour = colour_field; SEP;
birthday = date_field
{ {last_name; first_name; gender; favourite_colour; birthday} }
name_field: str = VAL { str }
gender_field:
| VAL "male" { Person.Male }
| VAL "female" { Person.Female }
| VAL "neither" { Person.Neither }
| VAL "unspecified" { Person.Unspecified }
;
是的,没有骰子。显然,我对非结构化词法分析的尝试已经很糟糕了。
解析这样的东西的惯用方法是什么?