Compiler construction 词法生成器如何识别语法的关键字?
我正在考虑如何编写一个lexer生成器。我想不出一个简单的方法来从语法中识别一种语言的关键字。显然,所有的关键字都是终端,但不是所有的终端都是关键字。例如,在以下简单语法中: 真值->真值|假值;; 数字->0'..9'; “true”和“false”是关键字,但“0”、“1”等不是Compiler construction 词法生成器如何识别语法的关键字?,compiler-construction,keyword,lexer,Compiler Construction,Keyword,Lexer,我正在考虑如何编写一个lexer生成器。我想不出一个简单的方法来从语法中识别一种语言的关键字。显然,所有的关键字都是终端,但不是所有的终端都是关键字。例如,在以下简单语法中: 真值->真值|假值;; 数字->0'..9'; “true”和“false”是关键字,但“0”、“1”等不是 非常感谢您的帮助。大多数lexer生成器要求程序员写出正则表达式(或类似的东西)来识别关键字(和其他终端)。我从未听说过有人试图从正式语法开始,然后自己找出关键词 例如,这里是几年前我为一个计算器编写的.l文件(l
非常感谢您的帮助。大多数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]; }
大多数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]; }
你的意思是明确声明关键字,即使它们已经在一些重写规则中使用过?@prophet_on_:如果我理解正确,是的。请参见编辑答案中的示例。您的意思是明确声明关键字,即使它们已在某些重写规则中使用过?@prophet_on_:如果我理解正确,是的。参见编辑答案中的示例。