2014-10-01 153 views
0

如果我只是想檢查一種語言的語法是否正確,使用yacc編寫語法分析器的簡便方法是什麼? Lex和Yacc和EBNF規範

+1

您的'EBNF'與ISO 14977:1996定義的EBNF不太相似。 – 2014-10-01 02:52:27

回答

1

請注意,EBNF的ISO標準是ISO 14977:1996,您在該問題中使用的'EBNF'與標準版本有很多相似之處。這讓我們不得不解釋你的語法規則。

  • 非終端以小寫形式寫成單個單詞。
  • 終端在全部大寫字母中寫成單個單詞。
  • 冒號用於將非終端與其定義分開。
  • 點(句點)用於標記規則的結束。
  • 方括號內包含可選(零次或一次)材質。

考慮到這些定義,你需要:

  • 一個詞法分析器識別報關,,常數,變量,如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 
    ; 

你的詞法分析器只是需要能夠直到您提供正確的規則,以可靠地識別這些假的憑證。