最近刚学习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 之间用空格连接是什么意思呢? 麻烦懂的人用通俗的语言描述一下如何理解规则这部分的语法
|
或verb
谓语VERB
动词ADVERB
副词合起来就是:
谓语
的构成方式:动词或
副词 动词或
谓语 动词你可以去看看
BNF范式
的介绍~