我正在考虑如何编写lexer生成器。我想不出一种简单的方法来从语法中识别一种语言的关键词。。显然,所有的关键词都是终端,但并不是所有的终端都是关键词。例如,在以下简单语法中:truth_value->'true'|'false';数字->'0'..'9’;"true"one_answers"false"是关键字,但"0"、"1"等不是。
感谢您的帮助。
大多数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]; }