2014-02-04 5 views
0

Я пытаюсь разобрать следующий ввод строки с использованием Lex и Yacc без успеха.Проанализировать имя пользователя и строки

«@user, некоторые случайный текст, @another пользователя, другой случайный текст»

Я использую следующую грамматику:

/* Lambda calculus grammar by Zach Carter */ 

%lex 
%% 

\s*\n\s* {/* ignore */} 
";"  { return 'SEP'; } 
"@"  { return 'AT'; } 
[a-zA-Z]+ { return 'VAR'; } 
<<EOF>> { return 'EOF'; } 
/lex 

%% 

file 
    : expr EOF 
    { return $expr; } 
    | EOF 
    ; 

expr 
    : AT expression 
    | expression 
    | SEP expression 
    ; 
expression 
    : VAR 
    { $$ = yytext; } 
    ; 

Вы можете дать этой грамматике попробовать here:

в результате я я хотел бы иметь это:

"@user; некоторый случайный текст; @ другой пользователь; другой случайный текст»

Выход:

пользователя некоторые

случайный текст

другой пользователь

другой случайный текст

+0

«Вы можете дать эту грамматику попробовать здесь». Er ... Нет, потому что 'AT не определен'. – Louis

+0

@Louis Это одна из проблем, которые я получил. Если вы посмотрите на ключевые слова lex, «@» {return AT; } 'хорошо определено – GETah

+0

Зная yacc/lex, bison/flex помогает использовать jison, но jison не является заменой бизону (или yacc, или чему-либо еще). Джисон - это его собственная вещь. Поэтому все, что работает с этими другими инструментами, не будет работать с jison, включая 'return AT'. То, что вызывает недоумение, заключается в том, что вы используете 'return 'VAR'', а не' return VAR', поэтому зачем возвращать AT'? – Louis

ответ

1

«нет успеха» или «не работает» не так полезно, как точное описание того, что пошло не так. Является ли ваш «результат» неправильным результатом или тем, что вы хотите видеть (если последнее, то предложение о том, что «пользовательский» должен быть единственным объектом, немного странно)? Трудно догадаться, какая структура вашего языка на самом деле предназначена для вашего вопроса, а отсутствие какой-либо рекурсивной структуры в вашей грамматике говорит о том, что проблема может быть чем угодно: «не может создать грамматику, которую генератор примет» на «неправильный» вывод". Таким образом, этот ответ, вероятно, ошибочен, но, возможно, он получит лучшее описание.

/* Lambda calculus grammar by Zach Carter */ 

%lex 
%% 

\s*\n\s* /* ignore */ 
\s+  /* ignore */ 
";"  { return 'SEP'; } 
"@"  { return 'AT'; } 
[a-zA-Z]+ { return 'VAR'; } 
<<EOF>> { return 'EOF'; } 
/lex 

%% 

file 
    : things EOF 
    { return $things; } 
    | EOF 
    ; 
things // can there be zero things? 
    : thing morethings 
    ; 
morethings 
    : SEP things 
    | 
    ; 
thing 
    : AT VAR 
    | text 
    ; 
text 
    : VAR moretext 
    ; 
moretext 
    : VAR moretext 
    | 
    ;  

 Смежные вопросы

  • Нет связанных вопросов^_^