Я просто пишу 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
спасибо. Я пытался что-то сделать с помощью 'yytext.replace (/ \\"/g, '') ', и это изначально не работало, но это или что вы предложили« правильный »способ сделать это bison/jison «Я чувствовал себя немного« взломанным », делая это, но если это так, как это делается, тогда я в порядке. – kalisjoshua
@kalisjoshua Я не знаю ни о каком другом способе этого делать, это, конечно, как я буду делать это с помощью flex '(хотя в' flex' вам все равно придется копировать 'yytext', так что вы можете почувствовать, что он менее« взломан »:)). – rici