Grammar yacc语法不足以解析文件

Grammar yacc语法不足以解析文件,grammar,yacc,lex,context-free-grammar,Grammar,Yacc,Lex,Context Free Grammar,我有一个如下所示的配置文件 我的yacc文件(test.y)如下 %% config_file_sections : main ; main : main_attribute_list { e_parse_debug_log_message(E_DEBUG_AT,"Found main_section\n"); e_parse_found_main_section_complete(); } ; main_attribute_list : T_E

我有一个如下所示的配置文件

我的yacc文件(test.y)如下

%%
config_file_sections
  : main 
  ;

main
  : main_attribute_list 
  {
    e_parse_debug_log_message(E_DEBUG_AT,"Found main_section\n");
    e_parse_found_main_section_complete();
  }
  ;
main_attribute_list
  : T_E_TYPE number
  {
    e_parse_debug_log_message(E_DEBUG_AT,"Found main section token T_E_TYPE:\n");
  }
  ;
number
    : NUMBER { $$ = $1; }
    ;
%%

如果我将文件传递给程序,它将挂起而没有任何输出。我的问题是上面给出的语法,用于解析上面显示的配置文件。

这根本不行。它甚至不能正确解析第一个字符,但之后它只允许一个节和一个名称-值对。你需要更像这样的东西:

%%
config_file
    : /* empty */
    | config_file config_file_section
    ;

config_file_section
    : '[' identifier ']' attribute_list
    ; 

attribute_list
    : /* empty */
    | attribute-list attribute-pair
    ;

attribute-pair
    : identifier '=' number
    ;

identifier
    : IDENTIFIER
    ;

number
    : NUMBER
    ;
%%

语义动作留给读者作为练习。

里面的东西
{}
。标识符指的是记号?叹气。你对数字有莱克斯规则。您当然可以为标识符编写一个?
%%
config_file
    : /* empty */
    | config_file config_file_section
    ;

config_file_section
    : '[' identifier ']' attribute_list
    ; 

attribute_list
    : /* empty */
    | attribute-list attribute-pair
    ;

attribute-pair
    : identifier '=' number
    ;

identifier
    : IDENTIFIER
    ;

number
    : NUMBER
    ;
%%