【发布时间】:2017-03-29 13:51:57
【问题描述】:
我正在学习 Flex/Bison。野牛手册说:
文字字符串记号的写法类似于 C 字符串常量;为了 例如,“
但我不知道如何使用它,也没有找到示例。
我有以下测试代码:
example.l
%option noyywrap nodefault
%{
#include "example.tab.h"
%}
%%
[ \t\n] {;}
[0-9] { return NUMBER; }
. { return yytext[0]; }
%%
example.y
%{
#include <stdio.h>
#define YYSTYPE char *
%}
%token NUMBER
%%
start: %empty | start tokens
tokens:
NUMBER "<=" NUMBER { printf("<="); }
| NUMBER "=>" NUMBER { printf("=>\n"); }
| NUMBER '>' NUMBER { printf(">\n"); }
| NUMBER '<' NUMBER { printf("<\n"); }
%%
main(int argc, char **argv) {
yyparse();
}
yyerror(char *s) {
fprintf(stderr, "error: %s\n", s);
}
生成文件
#!/usr/bin/make
# by RAM
all: example
example.tab.c example.tab.h: example.y
bison -d $<
lex.yy.c: example.l example.tab.h
flex $<
example: lex.yy.c example.tab.c
cc -o $@ example.tab.c lex.yy.c -lfl
clean:
rm -fr example.tab.c example.tab.h lex.yy.c example
当我运行它时:
$ ./example
3<4
<
6>9
>
6=>9
error: syntax error
有什么想法吗?
更新:我想澄清一下,我知道解决它的其他方法,但我想使用 文字字符串标记。
一种选择:使用多个“文字字符标记”:
tokens:
NUMBER '<' '=' NUMBER { printf("<="); }
| NUMBER '=' '>' NUMBER { printf("=>\n"); }
| NUMBER '>' NUMBER { printf(">\n"); }
| NUMBER '<' NUMBER { printf("<\n"); }
当我运行它时:
$ ./example
3<=9
<=
其他选择:
在example.l中:
"<=" { return LE; }
"=>" { return GE; }
在example.y中:
...
%token NUMBER
%token LE "<="
%token GE "=>"
%%
start: %empty | start tokens
tokens:
NUMBER "<=" NUMBER { printf("<="); }
| NUMBER "=>" NUMBER { printf("=>\n"); }
| NUMBER '>' NUMBER { printf(">\n"); }
| NUMBER '<' NUMBER { printf("<\n"); }
...
当我运行它时:
$ ./example
3<=4
<=
但是说明书上说:
除非您需要,否则不需要声明文字字符串标记 指定其语义值数据类型
【问题讨论】:
-
您确定
.匹配多个字符而不是单个字符吗? -
还有
yytext[0]? -
.只匹配一个字符,可以,但我认为不是问题。