Lex和Yacc以及EBNF规范

时间:2014-10-01 02:32:15

标签: yacc lex

如果我只想检查一种语言的语法是否正确, 使用yacc编写语法分析器的简便方法是什么。

1 个答案:

答案 0 :(得分:1)

请注意,EBNF的ISO标准是ISO 14977:1996,您在问题中使用的'EBNF'与标准版本的相似性有限。这使我们不得不解释你的语法规则。

  • 非终端以小写形式写成单个单词。
  • 终端以全部大写形式写成单个单词。
  • 冒号用于将非终端与其定义分开。
  • 点(句点)用于标记规则的结尾。
  • 方括号括起可选(零或一次)材料。

考虑到这些定义,您需要:

  • 一个词法分析器,可识别DECLARATION,OF,CONST,VAR,END作为终端(关键字)。
  • 包含declaration_unit,ident,const_declaration,var_declaration,procedure_interface,function_interface的规则的语法。

假设:

%token DECLARATION
%token OF
%token CONST
%token VAR
%token END

%%

declaration_unit
    :   DECLARATION OF ident opt_const_declaration opt_var_declaration
        opt_procedure_interface opt_function_interface DECLARATION END
    ;

opt_const_declaration
    :   /* Nothing */
    |   CONST const_declaration
    ;

opt_var_declaration
    :   /* Nothing */
    |   VAR var_declaration
    ;

opt_procedure_interface
    :   /* Nothing */
    |   procedure_interface
    ;

opt_function_interface
    :   /* Nothing */
    |   function_interface
    ;

您现在只需填写identconst_declarationvar_declarationprocedure_interfacefunction_interface的规则。

对于简单的语法检查,您可以为尚未完全定义的语法部分添加占位符标记和规则。例如,您可以添加:

%token IDENT
%token CONST_DECLARATION
%token VAR_DECLARATION
%token PROCEDURE_INTERFACE
%token FUNCTION_INTERFACE

ident
    :   IDENT
    ;

const_declaration
    :   CONST_DECLARATION
    ;

var_declaration
    :   VAR_DECLARATION
    ;

procedure_interface
    :   PROCEDURE_INTERFACE
    ;

function_interface
    :   FUNCTION_INTERFACE
    ;

您的词法分析器只需能够可靠地识别这些虚拟标记,直到您提供正确的规则。