C 在Lexer/Bison中识别系统库命令的最佳方法

C 在Lexer/Bison中识别系统库命令的最佳方法,c,bison,flex-lexer,language-design,nim-lang,C,Bison,Flex Lexer,Language Design,Nim Lang,我正在为一种新的编程语言编写一个intepreter。该语言的语法非常简单,“系统库”命令被视为简单的标识符(即使,如果不是特殊的构造,而是一个像其他任何东西一样的函数,只在内部预定义)。不,这还不是100万口齿不清中的一个 问题是: 我应该让Lexer捕捉它们,还是应该在AST构造代码中这样做 到目前为止我所做的: 我试着在我的Lexer脚本中识别它们,它们已经很多了——超过200个。我将相同的令牌发送回Bison(SYSTEM\u CMD),只使用不同的值(基本上是一个数字索引,指向存储它们

我正在为一种新的编程语言编写一个intepreter。该语言的语法非常简单,“系统库”命令被视为简单的标识符(即使
,如果
不是特殊的构造,而是一个像其他任何东西一样的函数,只在内部预定义)。不,这还不是100万口齿不清中的一个

问题是:

我应该让Lexer捕捉它们,还是应该在AST构造代码中这样做

到目前为止我所做的:

我试着在我的Lexer脚本中识别它们,它们已经很多了——超过200个。我将相同的令牌发送回Bison(
SYSTEM\u CMD
),只使用不同的值(基本上是一个数字索引,指向存储它们的系统命令数组)

作为一种方法,我认为这比必须在散列中查找它们中的每一个并查看它是否是系统命令要快得多

问题是Lexer变得相当巨大(我是说,在生成的二进制文件大小方面)相当快。我显然不喜欢它



考虑到我的关注点既快又小,可以嵌入,最推荐的方法是什么?

你也不认同它们。将所有这些保留到伪链接步骤,在该步骤中标识所有函数及其应该执行的操作。否则,你会把它们硬塞进语言中,这会导致以后在你想添加更多内容时遇到困难;而你却对这种语言嗤之以鼻。充其量,你应该把它们看作是Pascal所做的,作为一个想象的封闭范围的一部分,它的内容不是由语言本身指定的,或者是由它自己识别的。@ USE20721,谢谢。你有没有更多的参考来了解这一点,请你考虑什么“相当巨大”?我有一个简单的lexer,有500多个符号,大约是70k(用-Os编译)。@VenkateshNandigama帕斯卡用户手册和报告。@rici是的。我有一个用于Cobol-85的lexer,它有超过400个保留字,所有这些字都被单独识别为patters,它不是很大,支持最大的flex压缩。