Проблема с выходом лексического анализатора

Это мой код лексического анализатора, когда я ввожу следующее:

/*This is an example */

program
        var a,b:integer;

begin

        a =2;

        b =a+5;

        write(a);

        if b==1 then write(a);

end

вывод должен быть таким:

<res,program>
<res,var> <id,a>,<id,b>:<res,integer>;
<res,begin>
<id,a> <assign,=><num,2>;
<id,b> <assign,=><id,a><addop,+><num,5>;
<res,write>(<id,a>);
<res,if> <id,b><relop,==><num,1> <res,then> <res,write>(<id,a>);
<res,end>

но я мой вывод:

Lexical Error~/hedor1>exampler < input\ .txt 
<res,program><res,var><id,a>,<id,b>:<res,integer>;<res,begin><id,a><assign,=><num,2>;<id,b><assign,=><id,a><addop,+><num,5>;<res,write>(<id,a>);<res,if><id,b><relop,==><num,1><res,then><res,write>(<id,a>);<res,end>

Я не знаю, почему он просто избегает перехода на новую строку и не печатает его на выходе, хотя я определил это в разделе моих шаблонов \n printf("\n");в чем проблема?

1 ответ

Решение

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

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

Таким же образом, в вашем вводе после начального комментария у вас есть не одна, а две новые строки (поскольку там есть пустая строка), и это будет соответствовать вашему правилу {whitespace}+, а не дважды правилу \n,

Другие вопросы по тегам