Flex-BISON:如何定义句子?

时间:2012-04-16 22:09:01

标签: bison definition flex-lexer

在Flex中,您可以使用[a-zA-Z] [a-zA-Z0-9] *来定义单词。我该如何定义一个句子? 以下是我的灵活代码:

%{
#include <stdio.h>
#include <string.h>
#include "y.tab.h"
%}
%%
[0-9]+                  yylval=atoi(yytext);return NUMBER;
[a-zA-Z][a-zA-Z]*       return WORD;
[a-zA-Z][a-zA-Z0-9]*    return TERM;
%%

以下是野牛:

%{
#include <stdio.h>
#include <string.h>

void yyerror(const char *str)
{
    fprintf(stderr,"error: %s\n",str);
}

int yywrap()
{
    return 1;
}

main()
{
    yyparse();
}

%}

%token NUMBER WORD TERM 

commands: /* empty */
    | commands command
    ;
command:
    rule1
    |
    rule2
;

.....

谢谢

1 个答案:

答案 0 :(得分:1)

Flex或lex是词法分析器解决方案,它们的输出通常是您之前定义的令牌,它可以是世界,数字或术语。 另一方面,yacc或bison是parseres,我们定义我们的语法(规则集),它应该验证你将传递的输入流,在你的情况下这里是一个句子。

现在提出你的问题:经过验证的句子是在我们的语法中通过定义的规则验证的句子,例如“hello world”。已通过此规则验证

sentence : WORD WORD '.'
         ;

或这句话“我有20岁”,所以规则必须像这样

sentence    : words NUMBER words      /*words non terminal (list of words)*/
            ;
words       : words WORD
            | WORD
            ;

因此,您可以根据要解析的输入流来定义规则。