Tag: 编译器理论

在开发类似语言的小python时进行缩进控制

我正在使用flex,byacc(用于词法和解析)和C ++开发一个类似语言的小python,但我有一些关于范围控制的问题。 就像python一样,它使用白色空格(或制表符)进行缩进,不仅如此,但我想实现索引破坏,例如,如果你在while循环中键入“break 2”,那么在另一个while循环中它不仅会从最后一个,但也来自第一个循环(因此在rest后的数字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文件中吗? 对不起,长期以来,我们非常感谢任何帮助。 […]

C编译器如何实现返回大型结构的函数?

函数的返回值通常存储在堆栈或寄存器中。 但对于大型结构,它必须在堆栈上。 在这个代码的真实编译器中需要进行多少复制? 还是优化了? 例如: struct Data { unsigned values[256]; }; Data createData() { Data data; // initialize data values… return data; } (假设函数不能内联..)