词法生成器如何识别语法的关键词?

时间:2012-04-03 18:57:37

标签: compiler-construction keyword lexer

我正在考虑如何编写词法生成器。我想不出从语法中识别语言关键词的简单方法。显然所有关键词都是终端,但并非所有终端都是关键词。例如,在以下简单语法中: truth_value - > '真'| '假'; 数字 - > '0' .. '9'; 'true'和'false'是关键字,但'0','1'等不是。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

大多数词法生成器需要程序员写出正则表达式(或类似的东西)来识别关键字(和其他终端)。我从来没有听说过一个试图从正式语法开始,并自己弄清楚关键词。

例如,这是我多年前写的计算器的.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]; }