С ++ парсинг как пользовательский язык Интерпретатор - PullRequest
0 голосов
/ 26 февраля 2012

Мне нужно проанализировать входной текстовый файл как пользовательский язык, чтобы я мог интерпретировать его команды (строка за строкой) и выполнить его, это входные данные, которые я должен ожидать:

#Some variables
myInt = 2
myFloat = 2.5
myString = “Hello”

#Lists
myList = (myInt, myFloat, myInt + myFloat)
myOtherList = (myFloat + myFloat, myInt+ myInt)
subList = myList[:1]
completeList = myList + myOtherList + subList

#This should have no effect (it is ok if it is being calculated)
2+4

#Now some printing
print(myString)
print(“World”)
print(completeList)
print(completeList[3])

#Some syntax errors
b = “hello, this string is not enclosed right
c = myString + completeList
d = myInt + SOME_VARIABLE_I_HAVENT_DEFINED_YET

#First string to appear makes everything a string
print(1 + 2 + 15.5 + 2.2 + “Hi” + 3 + 4 + 6)
print(1 + 2 + 15.5 + 2.2 + 3 + 4 + 6 + “hi”)
print((1,2))

Так что у меня уже есть первыйпроверка функции, теперь я знаю, когда это команда print / assign / comment / bad синтаксис или что-то еще.Теперь я должен разобрать, что внутри функции печати и команд присвоения, я должен игнорировать пробелы, они также могут не быть разделителями, на которые можно рассчитывать.

Пожалуйста, подскажите, какие строковые функции я должен использовать икак для того, чтобы заставить это работать, я имею в виду, как вы можете разрезать токены, а также идентифицировать математические знаки?Я предполагаю, что он должен использовать некоторый стек, чтобы следовать за круглыми скобками типа списка и кавычек, нет?Любая общая и более подробная информация будет оценена, спасибо (:

ps

Вот вывод для этого кода:

Hello
World
(2, 2.5, 4.5, 5.0, 4, 2, 2.5)
5.0
InvalidSyntax : b = “hello, this string is not enclosed right
InvalidSyntax : c = myString + completeList
UndefinedVariableName : SOME_VARIABLE_I_HAVENT_DEFINED_YET
20.7Hi346
33.7hi
(1,2)

У меня уже есть все операторы перегрузки длячто мне нужно, мне нужно только разобрать его правильно и отправить в мои уже встроенные функции.

Ответы [ 2 ]

2 голосов
/ 26 февраля 2012

То есть у вас не было возможности прочитать Книгу Дракона ...

Как вы думаете о внедрении Lua или Python-интерпретатора в ваш продукт, вместо того, чтобы изобретать свой собственный язык? Это более распространенные и полноценные языки программирования. Кроме того, Google поможет вам найти множество руководств по их встраиванию, например:

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

Что касается Boost Spirit: я не рекомендую использовать его, который был написан людьми, которые просто хотели показать свою сообразительность, написав это (но в итоге продемонстрировали свое незнание о том, что такое практический дизайн программного обеспечения.)

2 голосов
/ 26 февраля 2012

Для этого существует замечательная библиотека C ++: ДУХ

...