yacc规则语法怎么解释?

最近刚学习lex与yacc,yacc第二部分,也就是规则部分稀里糊涂的. 书上的有些地方也没看明白.

%{

#include <stdio.h>

%}

%token NOUN PRONOUN VERB ADVERB ADJECTIVE PREPOSITION CONJUNCTION

%%

sentence: simple_sentence {printf("parsed a simple sentence. \n");}
        | compound_sentence {printf("parsed a compound sentence. \n");}
        ;

simple_sentence: subject verb object
                | subject verb object prep_phrase
                ;
compound_sentence: simple_sentence CONJUNCTION simple_sentence
                | compound_sentence CONJUNCTION simple_sentence
                ;
subject: NOUN
        | PRONOUN
        | ADJECTIVE subject
        ;
verb: VERB
    | ADVERB VERB
    | verb VERB
    ;
object: NOUN
    | ADJECTIVE object
    ;
prep_phrase: PREPOSITION NOUN
    ;

%%

extern FILE *yyin;

main()
{
    do {
        yyparse();
    } while(!feof(yyin));
}

yyerror(s);
char *s;
{
    fprintf(stderr, "%s \n", s);
}

上部分代码中
规则:

verb: VERB
    | ADVERB VERB
    | verb VERB
    ;

表达的意思是 定义一个标记 verb,如果匹配到了 VERB 或者 ADVERB VERB 或者 verb VERB,就做某个动作?
那我不是特别明白

verb: VERB
    | ADVERB VERB
    | verb VERB
    ;

这里的ADVERB VERB 之间用空格连接是什么意思呢? 麻烦懂的人用通俗的语言描述一下如何理解规则这部分的语法

阅读 3.6k
1 个回答
verb: VERB
    | ADVERB VERB
    | verb VERB
    ;

|

verb 谓语

VERB 动词

ADVERB 副词

合起来就是:

谓语的构成方式:动词 副词 动词 谓语 动词


你可以去看看BNF范式的介绍~

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进