2016-02-23 3 views
0

Итак, у меня есть грамматика, содержащая пустую строку. Грамматика что-то вроде этого:ocamlyacc с пустой строкой

S-> ε

S-> выражение ;; S

Я получаю сообщение об ошибке «Больше никаких состояний, чтобы отказаться», когда я запускаю свой парсер, поэтому считаю, что я не представляю пустую строку правильно. Итак, как мне это представить, особенно в файле lexer .mll?

Я знаю, что мне нужно сделать правило для этого, поэтому я думаю, что это так. Это то, что я думаю, что это должно выглядеть как для файла парсера .mly, за исключением материала для выражения.

s: 
| EMPTY_STRING   { [] } 
| expression SEMICOLON s { $1::$3 } 

ответ

1

Вы считаете эпсилон как токен, но это не знак. Это тоны с длиной в 0 раз. Поскольку там нет токенов, это не то, о чем должен знать ваш сканер. Просто парсер должен знать об этом.

Вот грамматика что-то вроде того, что я думаю, что вы хотите:

%token X 
%token SEMICOLON 
%token EOF 
%start main 
%type <char list> main 
%% 
main : 
    s EOF   { $1 } 

s : 
    | epsilon   { $1 } 
    | X SEMICOLON s { 'x' :: $3 } 

epsilon : 
        { [] } 

epsilon Обратите внимание, что не является терминал (не знак). Его определение - пустая последовательность символов.

+0

Правило epsilon совсем не полезно. Просто положите ... ничего. – Drup

+0

Спасибо за помощь. Я понял, что мне просто нужно использовать EOF в моей грамматике вместо пустой строки, чтобы заставить ее работать, потому что последний токен будет EOF. –

Смежные вопросы