Bison 检查字符串的格式是否为0^n 1 ^n

Bison 检查字符串的格式是否为0^n 1 ^n,bison,yacc,Bison,Yacc,我有一个Yacc程序来检查数字的形式是否为0^n 1^n %start S %% S:'0' S '1' {printf("Success\n");}|; %% (所有令牌都在lex文件中定义) 我得到的结果如下 0011 Success Success syntax error 1100 syntax error 我理解为什么Success会打印两次,但是第一次输出中的语法错误是什么 此外,LALR(1)解析器生成器bison是如何完成此任务的?语法错误源于您的语法无法识别空字符

我有一个Yacc程序来检查数字的形式是否为0^n 1^n

%start S
%%
    S:'0' S '1' {printf("Success\n");}|;
%%
(所有令牌都在lex文件中定义)

我得到的结果如下

0011
Success
Success
syntax error

1100
syntax error
我理解为什么Success会打印两次,但是第一次输出中的语法错误是什么


此外,LALR(1)解析器生成器
bison
是如何完成此任务的?

语法错误源于您的语法无法识别空字符串,因此,一旦
'1'的'0'
产品全部减少,就无法取得任何进展

Bison拒绝接受这种语法,但很容易修正:

%start S
%%
S: '1' S '0'
 | ;
%%

只要看看语法,就应该清楚如何使用一个标记先行解析字符串。实际上,语法是LL(1);您只需要一个
1
s的堆栈(或计数器)。如果这不是一个充分的解释,请启用bison的跟踪功能并观察解析过程。

问题是语法只匹配无限字符串——语法描述的语言中没有有限字符串

您需要添加一个带有有限字符串的“基本大小写”,以便它可以接受该字符串或由其构建的字符串。最明显的情况是空字符串(对于n=0):


@保罗:什么密码?关于这个问题,你是谁?我的语法将接受空字符串。请参阅上面的代码。
S : /* empty */
  | '0' S '1'
  ;