1

在 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
;

......

谢谢

4

1 回答 1

2

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

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

sentence : WORD WORD '.'
         ;

或者这句话“我有20岁”所以规则必须是这样的

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

因此,您可以在知道要解析的输入流的情况下定义规则。

于 2012-04-20T14:36:26.487 回答