【发布时间】:2012-04-03 18:57:36
【问题描述】:
我正在考虑如何编写词法分析器生成器。我想不出一种简单的方法来从语法中识别语言的关键字..显然所有关键字都是终端,但并非所有终端都是关键字。例如,在下面的简单语法中: 真值-> '真' | '错误的'; 数字 -> '0'..'9'; 'true' 和 'false' 是关键字,但 '0'、'1' 等不是。
感谢任何帮助。
【问题讨论】:
标签: compiler-construction keyword lexer
我正在考虑如何编写词法分析器生成器。我想不出一种简单的方法来从语法中识别语言的关键字..显然所有关键字都是终端,但并非所有终端都是关键字。例如,在下面的简单语法中: 真值-> '真' | '错误的'; 数字 -> '0'..'9'; 'true' 和 'false' 是关键字,但 '0'、'1' 等不是。
感谢任何帮助。
【问题讨论】:
标签: compiler-construction keyword lexer
大多数词法分析器生成器要求程序员写出正则表达式(或类似的东西)来识别关键字(和其他终端)。我从未听说过有人试图从正式语法开始,然后自己找出关键字。
例如,这是我多年前为计算器编写的 .l 文件 (lex/flex) 输入文件的一部分:
sqrt { return SQRT; }
lg { return LN2; }
log { return LOG; }
sin { return SIN; }
cos { return COS; }
tan { return TAN; }
pi { return PI; }
exit { return EXIT; }
prec { return PREC; }
print { return PRINT; }
\? { return PRINT; }
[ \t] { ; }
[-+*/=()^] { return yytext[0]; }
\n { lineno++; return yytext[0]; }
【讨论】: