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 は lexers ソリューションであり、それらの出力は通常、前に定義したトークンであり、世界、数値、または用語にすることができます。一方、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 に答える