lex / yacc не распознает строку (синтаксическая ошибка) - PullRequest
0 голосов
/ 18 марта 2012

Привет, я пытаюсь разрешить lex / yacc разбить эту строку

table subwayLines:int[3]

на токены таблицы, subwayLines, int [3] с необязательным [3] (то есть int или int [3])

все в порядке, пока я не попытаюсь распознать "int", вот что я сделал в lex

[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

тогда это дает мне синтаксическую ошибку, так кто-нибудь знает, как это изменить?спасибо

1 Ответ

1 голос
/ 19 марта 2012

Чтобы сделать [3] необязательным, это не будет работать:

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

Вы сделали необязательными только квадратные скобки, но не число между ними.Вам нужно что-то вроде

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

Т.е. вся часть в квадратных скобках является необязательной.

Также комбинация (REGEX)?+ не имеет особого смысла (часть ?+),Это эквивалентно (REGEX)*, поскольку вы фактически говорите, что (REGEX) является необязательным, один или несколько раз, что похоже на ноль или более.

(Не уверен, почему во второй необязательной запятойпример: первый не распознает запятую и не отображается в вашем примере ввода.)

...