为什么不能在yacc/bison文件中使用括号字符? 来源

为什么不能在yacc/bison文件中使用括号字符? 来源,bison,flex-lexer,yacc,lex,Bison,Flex Lexer,Yacc,Lex,I.l 测试 野牛给了我一个错误 $ make clean && make debug $ ./a.out < sample.ini 1: syntax error at [ $ make clean && make debug $ ./a.out < sample.ini [Token: 258/IDENTIFIER (foobar) Token: 259/BRACKETS_RIGHT (]) Token: 258/

I.l

测试 野牛给了我一个错误

$ make clean && make debug
$ ./a.out < sample.ini
1: syntax error at [

$ make clean && make debug
$ ./a.out < sample.ini
[Token: 258/IDENTIFIER           (foobar)
Token: 259/BRACKETS_RIGHT       (])
Token: 258/IDENTIFIER           (foo)
Token: 260/EQ                   (=)
Token: 258/IDENTIFIER           (bar)
$makeclean&&makedebug
$./a.out

:(

为了让bison能够使用像“[”这样的字符标记,扫描仪必须精确返回“[”

您的扫描仪似乎没有返回未知字符的任何内容。您需要添加默认规则:

.    { return yytext[0]; }

我建议始终使用flex
NodeDefault
选项捕获此类错误。此外,在编译时,gcc的
-Wall
选项也适用。请查看flex和bison的文档,了解如何使用它们的调试跟踪,而不是构建自己的跟踪。内置调试易于使用,并生成合理完整的输出。

这并不能解释语法错误。例如,如果一个人单独编译两个文件,则不会出现语法错误。@ThomasDickey:看看问题的末尾,你可以看到文本。语法错误是由OP的解析器产生的(运行
/a.out
)。然后OP在启用跟踪功能的情况下运行,您可以看到扫描仪从未生成
[
标记。您甚至可以在调试输出开始时从默认lex规则中看到
[
回显。
CC              = gcc
LEX             = flex
YACC            = bison

TARGET          = a.out

LEX_SRC         = $(wildcard *.l)
YACC_SRC        = $(wildcard *.y)
SRC             = $(patsubst %.y,%.tab.c,$(YACC_SRC)) $(patsubst %.l,%.yy.c,$(LEX_SRC))
INC             = $(patsubst %.y,%.tab.h,$(YACC_SRC)) $(patsubst %.l,%.yy.h,$(LEX_SRC))

DEBUG           = -DYYDEBUG -DYYERROR_VERBOSE
LDFLAGS         = -L/usr/local/opt/bison/lib \
                -L/usr/local/opt/flex/lib \
                -I/usr/local/opt/flex/include

all: $(SRC)
    $(CC) $(FLAGS) $(SRC) -o $(TARGET)

debug: $(SRC)
    $(CC) $(FLAGS) $(SRC) -o $(TARGET) $(DEBUG)

.PRECIOUS: %.yy.c

%.yy.c: %.l
    $(LEX) -t $< > $@

.PRECIOUS: %.tab.c

%.tab.c:%.y
    $(YACC) -o $@ -d $<

clean:
    rm -rf $(TARGET) $(SRC) $(INC) *.output 
[foobar]
foo=bar
$ make clean && make
$ ./a.out < sample.ini
section: foobar
key: foo, value: bar
$ make clean && make debug
$ ./a.out < sample.ini
Token: 259/BRACKETS_LEFT        ([)
Token: 258/IDENTIFIER           (foobar)
Token: 260/BRACKETS_RIGHT       (])
Token: 258/IDENTIFIER           (foo)
Token: 261/EQ                   (=)
Token: 258/IDENTIFIER           (bar)
$ git diff -U0
diff --git a/ini.l b/ini.l
index 2538353..12b2524 100644
--- a/ini.l
+++ b/ini.l
@@ -24 +23,0 @@ char *get_tokenname(token) {
-        CASE_RETURN( BRACKETS_LEFT  );
@@ -47 +45,0 @@ int main(void) {
-"["                     { return BRACKETS_LEFT; }
diff --git a/ini.y b/ini.y
index c605ea4..1498ff5 100644
--- a/ini.y
+++ b/ini.y
@@ -11 +11 @@
-%token BRACKETS_LEFT BRACKETS_RIGHT EQ
+%token BRACKETS_RIGHT EQ
@@ -22 +22 @@ line
-    : BRACKETS_LEFT section BRACKETS_RIGHT
+    : '[' section BRACKETS_RIGHT
$ make clean && make debug
$ ./a.out < sample.ini
1: syntax error at [

$ make clean && make debug
$ ./a.out < sample.ini
[Token: 258/IDENTIFIER           (foobar)
Token: 259/BRACKETS_RIGHT       (])
Token: 258/IDENTIFIER           (foo)
Token: 260/EQ                   (=)
Token: 258/IDENTIFIER           (bar)
.    { return yytext[0]; }