2017-10-28 10 views
0

javacc를 처음 사용했습니다. 어떤 문자열과도 일치 할 수있는 토큰을 정의하려고합니다. 정규식 구문 <ANY: (~[])+>이 작동하지 않습니다. 나는 다음과 같은 BNF를 매우 간단하게 뭔가를 달성 갖는 표현을 정의하려면 : 나는 문자열을 구문 분석 할 수있는 방법에 어떤 도움을 다음과 같이문자열에 일치하는 토큰을 정의하십시오.

<exp> ::= "path(" <string> "," <number> ")" 

나의 현재 .jj 파일은 다음과 같습니다

options 
{ 
} 
PARSER_BEGIN(SimpleAdd) 
package SimpleAddTest; 
public class SimpleAdd 
{ 
} 
PARSER_END(SimpleAdd) 
SKIP : 
{ 
    " " 
| "\r" 
| "\t" 
| "\n" 
} 
TOKEN: 
{ 
    < NUMBER: (["0"-"9"])+ > | 
    <PATH: "path"> | 
    <RPAR: "("> | 
    <LPAR: ")"> | 
    <QUOTE: "'"> | 
    <COMMA: ","> | 
    <ANY: (~[])+> 


} 

int expr(): 
{ 
    String leftValue ; 
    int rightValue ; 
} 
{ 

     <PATH> <RPAR> <QUOTE> leftValue = str() <QUOTE> <COMMA> rightValue = num() <LPAR> 
    { return 0; } 
} 

String str(): 
{ 
    Token t; 
} 
{ 

    t = <ANY> { return t.toString(); } 
} 

int num(): 
{ 
    Token t; 
} 
{ 
    t = <NUMBER> { return Integer.parseInt(t.toString()); } 
} 

나는 위의 JavaCC에 파일을 점점 오전 오류는 다음과 같습니다

Exception in thread "main" SimpleAddTest.ParseException: Encountered " <ANY> "path(\'5\',1) "" at line 1, column 1. 
Was expecting: 
    "path" ... 

답변

2

패턴 <ANY: (~[])+> 실제로 어떤 비어 있지 않은 문자열을 일치합니다. 문제는 이것이 당신이 정말로 원하는 것이 아니라는 것입니다. <ANY: (~[])+> 규칙이있는 경우 파일이 비어 있지 않으면 전체 파일과 일치합니다. 대부분의 경우 일치 규칙이 가장 길기 때문에 전체 파일은 [ANY, EOF]으로 파싱됩니다. 그게 니가 원하는거야? 아마도 그렇지 않습니다.

그래서 나는 당신이 정말로 원하는 것을 추측 할 것입니다. 큰 따옴표를 포함하지 않는 문자열을 원한다고 생각합니다. 어쩌면 인쇄되지 않는 문자가없는 것과 같은 다른 제한이있을 수 있습니다. 앞에 백 슬래시가 오는 경우 큰 따옴표를 허용 할 수 있습니다. 누가 알아? 필요에 따라 조정하십시오.

다음은 수행 할 수있는 작업입니다. 첫째, t.image 반환하지 실제로 무엇을

TOKEN: 
{ 
    < NUMBER: (["0"-"9"])+ > | 
    <PATH: "path"> | 
    <RPAR: "("> | 
    <LPAR: ")"> | 
    <COMMA: ","> | 
    <STRING: "\"" (~["\""])* "\"" > 
} 

그런 다음

int expr(): 
{ 
    String leftValue ; 
    int rightValue ; 
} 
{  
     <PATH> <RPAR> leftValue=str() <COMMA> rightValue = num() <LPAR> 
    { return 0; } 
} 

String str(): 
{ 
    Token t; 
    int len ; 
} 
{  
    t = <String> 
    { len = t.image.length() ; } 
    { return t.image.substring(1,len-1); } 
} 
+0

도움을 네, 정확히, 덕분에 문법을 변경하여 토큰의 정의를 대체? – Noor

+0

일치하는 문자의 문자열입니다. –