2014-09-18 2 views
0

Я просто пишу DSL и хотел бы использовать JISON (http://zaach.github.io/jison). Я пытаюсь изучить синтаксис грамматики и столкнулся с проблемой с указанием строки символов в двойных кавычках.Как определить строку в JISON

То, что я думаю, будет работать это:

%lex 
%% 

[\n\s]+     /* skip whitespace */ 
"true"|"false"   return 'BOOL' 
"IF"     return 'START' 
"AND"|"OR"    return 'LOGIC' 
<<EOF>>     return 'EOF' 
.      return 'INVALID' 

/lex 

%start string 
%% 

string 
    : '"' [^"]+ '"' 
     {$$ = $2;} 
    ; 

... или, возможно:

%lex 
%% 

[\n\s]+     /* skip whitespace */ 
"true"|"false"   return 'BOOL' 
"IF"     return 'START' 
"AND"|"OR"    return 'LOGIC' 
\"[^"]+\"    return 'STRING' 
<<EOF>>     return 'EOF' 
.      return 'INVALID' 

/lex 

%start string 
%% 

string 
    : STRING 
     {$$ = $1;} 
    ; 

Это первая (в основном) не работает вообще, в то время как второй один любопытное работает ; когда он находит строку, значение выходит из экранированных двойных кавычек.

Есть ли хороший ресурс, который помогает с изучением определений грамматики JISON/BISON/BNF? Я искал вокруг, но не смог найти ничего, что мне помогло; а не майор comp/sci. Я просто пропустил что-то простое или что-то более существенное?

Для некоторого контекста:

Я пытаюсь определить простой DSL для разбора простых условий:

IF Something > 100 
AND Another == true 
    doAction 2.51 

ответ

1

Вы, вероятно, просто нужно обрезать цитаты:

\"[^"]+\"   yytext = yytext.slice(1,-1); return 'STRING' 

Помимо игрушечных языков, строки обычно намного сложнее, чем просто последовательность символов, окруженных кавычками. Вы, как правило, по крайней мере иметь дело с какой-либо формой специальных символов:

"A \t tab and a newline \n embedded in a \"string\"." 

Или SQL/CVS стиля цитата Экранирование:

"Embedded ""quoted string"" in a quoted string." 

И вы даже можете захотеть сделать Perl/Bash стиль замены переменной ,

"This gets really complicated: $ButSomePeopleLikeIt" 

Так что переработка струны довольно распространена, а не только для удаления разделителей. Это может быть сделано одним символом (последовательностью) за раз с начальными условиями или в отдельной операции последующей обработки.

+0

спасибо. Я пытался что-то сделать с помощью 'yytext.replace (/ \\"/g, '') ', и это изначально не работало, но это или что вы предложили« правильный »способ сделать это bison/jison «Я чувствовал себя немного« взломанным », делая это, но если это так, как это делается, тогда я в порядке. – kalisjoshua

+0

@kalisjoshua Я не знаю ни о каком другом способе этого делать, это, конечно, как я буду делать это с помощью flex '(хотя в' flex' вам все равно придется копировать 'yytext', так что вы можете почувствовать, что он менее« взломан »:)). – rici

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

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