Я разрабатываю небольшой язык, похожий на python, с использованием flex, byacc (для лексического анализа и синтаксического анализа) и C++, но у меня есть несколько вопросов относительно управления областью действия.
точно так же, как python, он использует пробелы (или вкладки) для отступов, и не только это, но я хочу реализовать разрыв индекса, например, если вы наберете «break 2» внутри цикла while, который находится внутри другого цикла while, он не только сломается от последний, но тоже из первого цикла (отсюда цифра 2 после перерыва) и так далее.
пример:
while 1
while 1
break 2
'hello world'!! #will never reach this. "!!" outputs with a newline
end
'hello world again'!! #also will never reach this. again "!!" used for cout
end
#after break 2 it would jump right here
но поскольку у меня нет символа табуляции «анти», чтобы проверить, когда заканчивается область действия (например, C, я бы просто использовал символ «}»), мне было интересно, будет ли этот метод лучшим:
Я бы определил глобальную переменную, такую как «int tabIndex» в моем файле yacc, к которой я буду обращаться в своем файле lex, используя extern. затем каждый раз, когда я нахожу символ табуляции в моем файле lex, я увеличиваю эту переменную на 1. при анализе моего файла yacc, если я нахожу ключевое слово «break», я уменьшаю его на количество, введенное после него из переменной tabIndex, и когда я достигаю и EOF после компиляции, и я получаю tabIndex! = 0, я бы вывел ошибку компиляции.
теперь проблема в том, как лучше всего увидеть, уменьшился ли отступ, должен ли я прочитать символы \b (backspace) из lex, а затем уменьшить переменную tabIndex (когда пользователь не использует break)?
другой способ добиться этого?
также еще один небольшой вопрос: я хочу, чтобы каждый исполняемый файл имел начальную точку в функции, называемой start (), должен ли я жестко закодировать это в моем файле yacc?
извините за длинный вопрос, любая помощь очень ценится. также, если кто-то может предоставить файл yacc для python, было бы неплохо в качестве руководства (пытался искать в Google и не повезло).
заранее спасибо.