Flex-лексер, как сопоставить простые утверждения? - PullRequest
0 голосов
/ 09 февраля 2019

Я пишу гибкий код, чтобы соответствовать простым заявлениям c ++.Например:

a=b+c;
a=12;

и т. Д.

Я написал следующее:

stat ^[a-zA-Z][a-zA-Z0-9]*+"="([a-zA-Z][a-zA-Z0-9]*|([0-9][^a-zA-Z])+)+(("+"|"-"|"*"|"/")([a-zA-Z][a-zA-Z0-9]*|([0-9][^a-zA-Z])+)+)*+";"$

Это утверждение c=a+b*23; a=2+32;, но не a=2+3;.

Код выше: If a variable name starts from a-zA-Z then accept it, but if it starts with a number then reject this.

Так что ([a-zA-Z][a-zA-Z0-9]*|([0-9][^a-zA-Z])+) будет соответствовать, если слово начинается с алфавита, тогда может быть цифра или алфавит, но если есть цифра, то следующий символдолжен быть цифрой (для операторов типа a=10;).

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Идея лексического сканера заключается в том, что он идентифицирует отдельные токены (идентификаторы, литеральные константы, операторы, знаки пунктуации и т. Д.), А не полные синтаксические конструкции, такие как операторы.

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

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

0 голосов
/ 09 февраля 2019

Выражение ([0-9][^a-zA-Z])+ соответствует только числам с четным числом цифр.Вы, вероятно, имели в виду ([0-9][^a-zA-Z]*)+ (вставка звездочки для второго класса символов делает его необязательным).

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

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

См. Также:

...