在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
;
.....
谢谢
答案 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
;
因此,您可以根据要解析的输入流来定义规则。