разбор — Lexer и парсер на C ++ от EBNF

Мне нужно написать лексер и парсер для данной грамматики (мне нужно делать это вручную, а не с помощью генераторов). Я провел много исследований, но до сих пор не могу понять, как его кодировать.

Например, у меня есть (грамматика в EBNF):

<Letter> ::= [A-Za-z]

<IntegerLiteral> ::=<Digit> { <Digit> }

Это нужно определить в лексере или в парсере? И как?

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

1

Решение

То, что вы показываете нам, похоже, определяет типы токенов. Так и идет в лексере.

Хитрость в написании лексера заключается в том, чтобы просто взять введенный вами текст (который представляет собой просто длинный поток отдельных символов) и посмотреть на них один за другим. Каждый раз, когда вы смотрите на символ, классифицируйте его в соответствии с EBNF выше (т.е. это буква или IntegerLiteral), а затем генерируйте соответствующий токен.

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

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]