Ошибка парсера - PullRequest
       17

Ошибка парсера

1 голос
/ 02 июля 2011

Я пишу компилятор в Ocaml. Я хочу реализовать что-то подобное:

program test;
var
   a,b : boolean;
   n : integer;
name
   ([2,3], [4,5]) : boolean;
   ([7,8], [9,10]), ([12,13], [14,15]) : integer;  
begin
   ...
end.

На самом деле каждая из моих программ содержит двухмерный массив. ([2,3], [4,5]) : boolean объявляет, что все элементы в [2,3] x [4,5] являются логическими.

Мой вопрос о том, как позволить синтаксическому анализатору хорошо прочитать объявление имен. Вот мои sib_parser.mly и sib_syntax.ml . Они хорошо компилируются, но когда я тестирую двоичный файл с помощью программы, он выдает ошибку синтаксического анализатора. Может ли кто-нибудь помочь? Большое спасибо!

1 Ответ

2 голосов
/ 02 июля 2011

Вам нужно немного разложить ваш код;правила, которые вы показываете, не только ужасны, но и содержат много избыточности.Например, два правила в основном одинаковы, за исключением последнего терминала;Вы могли бы легко разложить эту часть по определенному правилу:

type_name:
| INTEGER { St_int }
| BOOLEAN { St_bool }

Чтобы ответить на ваш вопрос, параметры в параметризованных приложениях правил не могут быть последовательностью терминала (что должно возвращать все это?), а толькоодин «фактический», который является либо терминальным, нетерминальным, либо применением параметризованного правила.Это заставляет вас разбивать вашу грамматику на отдельные произведения, что хорошо.

%inline couple(open_sep,X,close_sep):
| open_sep x1 = X COMMA x2 = X close_sep { (x1, x2) }

rectangle:
| rect = couple(LPAREN, couple(LBRACKET, INT, RBRACKET), RPAREN) { rect }

type_name:
| INTEGER { St_int }
| BOOLEAN { St_bool }

binding_names:
| ids_names = separated_nonempty_list (COMMA, rectangle) COLON ty = type_name
    { [] (* put what you want here *) }

В этом случае rectangle возвращает (int * int) * (int * int).

PS: если вы столкнетесь с подобнымснова ошибка, не стесняйтесь читать менгир документация (PDF) .

...