Я работаю над простым анализатором / лексером для небольшого проекта, но столкнулся с проблемой.
Я разбираю контент по этим строкам:
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 }
;
Да, без кубиков. Очевидно, моя попытка неструктурированного лексирования уже терпит неудачу.
Какой идиоматический способ разобрать что-то вроде этого?
gender_field
как объединение этих токенов. - person Richard-Degenne   schedule 18.07.2018