2012-03-17 61 views
0

嗨,我试图让法/ yacc的拆分此字符串的lex/yacc的将无法识别的字符串(语法错误)

table subwayLines:int[3] 

成表,subwayLines令牌,INT [3]与[ 3]可选的(即int或INT [3])

一切都很好,直到我试图识别“INT”, 所以这是我在法

[A-Za-z0-9\[\]]+ { /* column property*/ 
        yylval.sval = (char *)strdup(yytext); 
      char* temp=yylval.sval; 
      return STRING; 
       } 

我才知道问题在

[A-Za-z0-9\[\]]+ 

,因为当我改成了

[A-Za-z]+("[")?+[0-9]+("]")?+(",")? 

它的工作原理只是我现在还不能去没有“[”或“]”,例如,如果我在字符串中写道的:

table subwayLines:int 

然后它给了我一个语法错误 所以有谁知道如何改变它?感谢

+0

是否有一个原因认识到'INT [3 ]'作为一个字符串标记,而不是将其作为四个标记返回并解析语法?如果有空白(是否允许?) 'int [3]'。 – Kaz 2012-03-19 19:49:59

回答

1

为了使[3]可选的,这是不行的:

[A-Za-z]+("[")?+[0-9]+("]")?+(",")? 

你只由方括号可选的,但不是数量之间。你需要像

[A-Za-z]+("["[0-9]+"]")? 

即使整个方括号部分是可选的。

另外组合(REGEX)?+没有多大意义(它的?+的一部分)。这相当于(REGEX)*,因为你有效地说(REGEX)是可选的,一次或多次,这是零或更多。

(不知道为什么你在第二个例子中,可选的逗号;第一个不承认一个逗号,它不是在你的输入例所示)

相关问题