Большинство наборов инструментов разделяют весь процесс на две отдельные части
- лексер (он же токенизатор)
- парсер (он же грамматика)
Токенайзер разделит входные данные на токены.Парсер будет работать только с токеном «поток» и строить структуру.
Ваш вопрос, кажется, сфокусирован на токенизаторе.Но ваше второе решение смешивает грамматический парсер и токенизатор в один шаг.Теоретически это также возможно, но для новичка намного проще сделать это так же, как и большинство других инструментов / фреймворков: держите шаги раздельно.
К вашему первому решению: я хотел быразбить ваш пример на следующий пример:
T_KEYWORD_IF "if"
T_LPAREN "("
T_IDENTIFIER "x"
T_GT ">"
T_LITARAL "5"
T_RPAREN ")"
T_KEYWORD_RET "return"
T_KEYWORD_TRUE "true"
T_TERMINATOR ";"
В большинстве языков ключевые слова нельзя использовать в качестве имен методов, имен переменных и так далее.Это отражается уже на уровне токенизатора (T_KEYWORD_IF
, T_KEYWORD_RET
, T_KEYWORD_TRUE
).
Следующий уровень использует этот поток и, применяя формальную грамматику, создаст некоторую структуру данных (часто называемую AST - абстрактное синтаксическое дерево), которая может выглядеть следующим образом:
IfStatement:
Expression:
BinaryOperator:
Operator: T_GT
LeftOperand:
IdentifierExpression:
"x"
RightOperand:
LiteralExpression
5
IfBlock
ReturnStatement
ReturnExpression
LiteralExpression
"true"
ElseBlock (empty)
Реализациясинтаксический анализатор обычно выполняется некоторыми фреймворками.Внедрение чего-то подобного вручную и обычно выполняется в университете в лучшую часть семестра.Таким образом, вы действительно должны использовать какую-то структуру.
Входные данные для структуры синтаксического анализатора грамматики обычно представляют собой формальную грамматику в некотором виде BNF .Ваша часть «если» может выглядеть так:
IfStatement: T_KEYWORD_IF T_LPAREN Expression T_RPAREN Statement ;
Expression: LiteralExpression | BinaryExpression | IdentifierExpression | ... ;
BinaryExpression: LeftOperand BinaryOperator RightOperand;
....
Это только для того, чтобы понять.Разбор языка реального мира, такого как Javascript , корректно - задача не из легких.Но смешно.