Я пытаюсь создать парсер, но я не могу понять, как он работает. Мне нужна помощь, когда кто-то укажет мне в правильном направлении, чтобы я мог забрать его оттуда.Построение парсера в прологе
У меня есть токенизатор и лексер.
Tokenizer выход:
[INT, добавить, (, INT, A ,,, INT, б, в), =, а, +, б, Int, letin, (, INT, а,), =, пусть, б, =, 10, в, добавить, (, А ,,, Ь,), INT, равным, (, Int, A ,,, INT, б,), =, если, а, == , b, then, letin, (, a,), else, 1, int, main, (, int, input,), =, equal, (, input ,,, 2,)]
Lexer Output:
[TYPE_INT, ИДЕНТИФИКАТОР, OPEN_P, TYPE_INT, ИДЕНТИФИКАТОР, зАПЯТАЯ, TYPE_INT, ИДЕНТИФИКАТОР, CLOSE_P, ASSIGN, ИДЕНТИФИКАТОР, ARITH_ADD, ИДЕНТИФИКАТОР, TYPE_INT, ИДЕНТИФИКАТОР, OPEN_P, TYPE_INT, ИДЕНТИФИКАТОР, CLOSE_P, ASSIGN, LET, ИДЕНТИФИКАТОР, ASSIGN , IDENTIFIER, LET_IN, IDENTIFIER, OPEN_P, IDENTIFIER, COMMA, IDENTIFIER, CLOSE_P, TYPE_INT , ИДЕНТИФИКАТОР, OPEN_P, TYPE_INT, ИДЕНТИФИКАТОР, ЗАПЯТАЯ, TYPE_INT, ИДЕНТИФИКАТОР, CLOSE_P, ASSIGN, COND_IF, ИДЕНТИФИКАТОР, LOGIC_EQ, ИДЕНТИФИКАТОР, COND_THEN, ИДЕНТИФИКАТОР, OPEN_P, ИДЕНТИФИКАТОР, CLOSE_P, COND_ELSE, целочисленный, TYPE_INT, ИДЕНТИФИКАТОР, OPEN_P, TYPE_INT, ИДЕНТИФИКАТОР , CLOSE_P, ASSIGN, IDENTIFIER, OPEN_P, IDENTIFIER, COMMA, INTEGER, CLOSE_P]
Теперь мне нужно построить парсер. Я не понимаю, как начать и как включать параметризованные конструкции.
Мои правила должны быть примерно такими.
program --> functionList.
functionList --> function,functionListCollection.
functionListCollection --> functionList | [].
function --> typeID(typeIdList),[=],expression.
typeID --> [int],[id] | [bool],[id].
typeIdList --> typeID,typeIdListCollection.
typeIdListCollection --> [,], typeIdList | [].
expression --> [if], comparison, [then], value, [else], value.
expression --> [let],[id],[=], value, [in], expression.
expression --> value, extraExpression.
extraExpression --> arithmetic | [].
arithmetic --> [+], value | [-], value.
comparison --> value, comparisonRight.
comparisonRight --> [=],[=],value.
comparisonRight --> [!], [=], value.
comparisonRight --> [>], value.
comparisonRight --> [>], [=], value.
value --> [number].
value --> [id], valueParameters.
valueParameters --> [(],parameters,[)]. | [].
parameters --> value, parametersList.
parametersList --> [,], parameters | [].
Я ищу построить предикат, который берет лексический список и выдает список из синтаксического анализатора. Затем я заменим числа и идентификаторы, просмотрев список токенов. Некоторая помощь в том, как начать, будет высоко оценена. Спасибо.