2017-11-07 10 views
0

나는 JISON을 사용하는 데 약간의 문제가 있습니다. 점으로 분리 된 대괄호 안에 2 개의 문자열을 일치 시키려고합니다. 내가 만나는 문제는 문자열 중 하나라도 숫자 또는 빼기로 시작하면 MINUS 또는 NUMBER [어느 것이 맞음]으로 인식하지만 처음에는 STRING 정규 표현식이 사용자가 입력 한 문자열과 일치하는지 확인한 다음 그 후에 NUMBER 또는 MINUS를 확인하십시오.동일한 문자를 사용하는 JISON 토큰

%lex 
%% 

'-'        return 'MINUS' 
[0-9]+       return 'NUMBER' 
[_-]+       return 'SYMBOL' 
[a-zA-Z0-9_-\s]+    return 'STRING' 
'.'        return 'DOT' 
'['        return '[' 
']'        return ']' 
<<EOF>>       return 'EOF' 

/lex 

%start program 

%% 

program 
    : e EOF 
     {console.log(JSON.stringify($1, null, 4)); return $1; } 
    ; 

e 
    : NUMBER 
     { $$ = {node: 'NUMBER', value: parseInt(yytext)}; } 
    | STRING 
     { $$ = {node: 'STRING', value: yytext}; } 
    | SYMBOL 
     { $$ = {node: 'SYMBOL', value: yytext}; } 
    | '[' STRING DOT STRING ']' 
     { $$ = {node: 'SQUARE_BRACKETS', left: $2, right: $4}; } 
    ; 

[2 - 20 - March.Gum]과 일치해야합니다 (예 :).

감사합니다.

답변

0

STRINGSTRING 먼저 일치한다고 주장하면 어떤 MINUS, NUMBER 또는 SYMBOL이 때문에, 이들 중 누구도 일치되지 않습니다 일치하고 당신은뿐만 아니라 그냥 파일을 제거 할 수 있습니다. Jison은 일치하는 패턴을 찾을 때까지 순서대로 패턴을 찾습니다.

아마도 대괄호로 묶은 표현의 내용을 다르게 일치시키는 것이 좋습니다. 그렇다면 다른 토큰 화 전략이 필요합니다 (요구 사항이 무엇인지 명확히해야합니다).


솔직히 말해서, 나는

[_-]+    return SYMBOL; 

은 당신이 정말로 대시와 밑줄을 포함하는 경우에만 일치하는 시퀀스에 SYMBOL을 계획입니까 이해하지? (-_____-_____-)

+0

죄송합니다. SYMBOL을 (를) 제거하는 것을 잊어 버렸습니다. 예를 들어, JISON이 처음 발견 된 패턴과 일치한다는 것을 알았지 만 문제를 해결할 방법이 있습니까? – Andy

+0

@andy : 어떤 상황에서 정확하게 말할 수있는 경우에만 'NUMBER'를 인식해야합니다. – rici

+0

"[2-20-March.Gum] - 2"와 같은 일을하고 싶습니다. 그래서 저에게는 MINUS와 NUMBER가 있습니다. 나는 패턴으로 "SQUARE_BRACKETS MINUS NUMBER"를 할 수 있기를 희망했다. – Andy