【问题标题】:How does a lexer generator identify the keywords of a grammar?词法分析器生成器如何识别语法的关键字?
【发布时间】:2012-04-03 18:57:36
【问题描述】:

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

感谢任何帮助。

【问题讨论】:

    标签: compiler-construction keyword lexer


    【解决方案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]; }
    

    【讨论】:

    • 您的意思是明确声明关键字,即使它们已经在某些重写规则中使用过?
    • @prophet_on_that:如果我理解正确,是的。请参阅已编辑答案中的示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 2011-01-30
    相关资源
    最近更新 更多