Flex BISON:如何定义一个句子?
在Flex中,使用[a-zA-Z][a-zA-Z0-9]*来定义单词。我如何定义一个句子? 以下是我的flex代码:Flex BISON:如何定义一个句子?,bison,definition,flex-lexer,Bison,Definition,Flex Lexer,在Flex中,使用[a-zA-Z][a-zA-Z0-9]*来定义单词。我如何定义一个句子? 以下是我的flex代码: %{ #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
%{
#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;
%%
%{
#包括
#包括
#包括“y.tab.h”
%}
%%
[0-9]+yylval=atoi(yytext);返回号码;
[a-zA-Z][a-zA-Z]*返回单词;
[a-zA-Z][a-zA-Z0-9]*返回期限;
%%
下面是野牛:
%{
#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
;
%{
#包括
#包括
无效错误(常量字符*str)
{
fprintf(strderr,“错误:%s\n”,str);
}
int yywrap()
{
返回1;
}
main()
{
yyparse();
}
%}
%符号数字字术语
命令:/*空*/
|命令命令
;
命令:
规则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
;
因此,您需要定义规则,了解将要解析的输入流