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

Compiler construction 词法生成器如何识别语法的关键字?,compiler-construction,keyword,lexer,Compiler Construction,Keyword,Lexer,我正在考虑如何编写一个lexer生成器。我想不出一个简单的方法来从语法中识别一种语言的关键字。显然,所有的关键字都是终端,但不是所有的终端都是关键字。例如,在以下简单语法中: 真值->真值|假值;; 数字->0'..9'; “true”和“false”是关键字,但“0”、“1”等不是 非常感谢您的帮助。大多数lexer生成器要求程序员写出正则表达式(或类似的东西)来识别关键字(和其他终端)。我从未听说过有人试图从正式语法开始,然后自己找出关键词 例如,这里是几年前我为一个计算器编写的.l文件(l

我正在考虑如何编写一个lexer生成器。我想不出一个简单的方法来从语法中识别一种语言的关键字。显然,所有的关键字都是终端,但不是所有的终端都是关键字。例如,在以下简单语法中: 真值->真值|假值;; 数字->0'..9'; “true”和“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]; }

大多数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_:如果我理解正确,是的。参见编辑答案中的示例。