Как мне обрабатывать новые строки в грамматике бизонов, не допуская всех символов? - PullRequest
2 голосов
/ 03 февраля 2011

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

Мой лексер:

%{
    #include
%}
%%
"\n" {return NEWLINE; }

Мой парсер:

%{
    #include <stdlib.h>
%}
% token NEWLINE

%%

program:
| program line
;
line: NEWLINE
;

%%

#include <stdio.h>
int yyerror(char *s)
{
    printf("%s\n", s);
    return(0);
}
int main(void)
{
    yyparse();
    exit(0);
}

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

Чего мне не хватает?

Спасибо

Ответы [ 2 ]

2 голосов
/ 03 февраля 2011

В настоящее время ваш лексер выводит эхо и игнорирует все не-символы новой строки (это действие по умолчанию в лексах для символов, которые не соответствуют ни одному правилу), поэтому анализатор будет только когда-либо видеть новые строки.

Как правило, ваш лексер должен что-то делать с любым / каждым возможным вводимым символом. Он может игнорировать их (молча или с сообщением) или возвращать токены для парсера. Обычный подход состоит в том, чтобы последнее правило лексера было:

.         return *yytext;

, который соответствует любому отдельному символу (кроме символа новой строки) и отправляет его анализатору как есть. Это последнее правило, так что любое более раннее правило, которое соответствует одному символу, имеет приоритет,

Это полностью не зависит от парсера, который видит только ту часть ввода, которую дает лексер.

1 голос
/ 23 октября 2012

У вас есть правила по умолчанию.Добавьте опцию nodefault, чтобы решить вашу проблему.Ваш лексер будет выглядеть так:

%option nodefault
%{
    #include <stdlib.h>
%}
%%
"\n" {return NEWLINE; }
...