lexer生成器如何识别语法的关键字



我正在考虑如何编写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]; }

最新更新