我正在使用 flex、byacc(用于词法和解析)和 C++ 开发类似 Python 的小型语言,但我对范围控制有一些疑问。
就像python一样,它使用空格(或制表符)进行缩进,不仅如此,我还想实现索引中断,例如,如果你在另一个while循环内的while循环内键入“break 2”,它不仅会从最后一个,但也从第一个循环开始(因此中断后的数字为 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,我只会使用 '}' 字符)我想知道这种方法是否是最好的:
我会在我的 yacc 文件上定义一个全局变量,例如“int tabIndex”,我将使用 extern 在我的 lex 文件中访问它。然后每次我在我的 lex 文件中找到一个制表符时,我都会将该变量增加 1。在解析我的 yacc 文件时,如果我找到一个“break”关键字,我会减少从 tabIndex 变量中键入的数量,当我在编译后到达和 EOF,我得到一个 tabIndex != 0 我会输出编译错误。
现在的问题是,查看缩进是否减少的最佳方法是什么,我应该从 lex 读取 \b (退格)字符,然后减少 tabIndex 变量(当用户不使用 break 时)?
另一种方法来实现这一点?
也只是另一个小问题,我希望每个可执行文件都有一个名为 start() 的函数的起点,我应该将它硬编码到我的 yacc 文件中吗?
很抱歉这个问题很长,非常感谢任何帮助。另外,如果有人可以为 python 提供一个 yacc 文件作为指导(尝试在 Google 上查找但没有运气)。
提前致谢。