2012-03-17 126 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)是可選的,一次或多次,這是零或更多。

(不知道爲什麼你在第二個例子中,可選的逗號;第一個不承認一個逗號,它不是在你的輸入例所示)

相關問題