2014-09-18 6 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." 

그리고 당신도 펄/배쉬 스타일 변수 대체를 수행 할 수 있습니다 .

"This gets really complicated: $ButSomePeopleLikeIt" 

문자열을 다시 처리하는 것은 구분자를 제거하는 것이 아니라 매우 일반적입니다. 시작 조건을 사용하여 한 번에 하나의 문자 (시퀀스)를 수행하거나 별도의 사후 처리 작업을 수행 할 수 있습니다.

+0

감사합니다. 나는'yytext.replace (/ \\ "/ g, '')'를 사용하여 일종의 시도를하고 있었지만 초기에는 작동하지 않았지만,이 바이슨/? 나는이 일을 조금 "해킹"한다고 느꼈지만, 그것이 어떻게 이루어지면 괜찮 았는가. – kalisjoshua

+0

@kalisjoshua 나는 그것을하는 다른 방법을 모른다; 그것은 내가'flex '('flex'에서는 어쨌든'yytext'를 복사해야합니다. 그렇기 때문에 "hacky"라고 느낄 수도 있습니다 :)). – rici