2012-12-06 3 views
0

토큰 접두사. 문제는 -이 제외 토큰으로 구문 분석되는 대신 토큰 텍스트에 포함되는 것입니다. 나는 쉬운 것을 놓치고 있다고 확신하지만 나는 그것을 알아낼 수 없다.JavaCC에 내 쿼리 언어에이 같은 문자열을 허용하기 위해 노력하고있어

options { 
IGNORE_CASE=true; 
LOOKAHEAD=2; 
STATIC=false; 
} 
PARSER_BEGIN(SimpleQueryParser) 

public class SimpleQueryParser { 

    Query query = new Query(); 

    public Query getQuery() { 
    return query; 
    } 
} 

PARSER_END(SimpleQueryParser) 

SKIP : { " " | "\t" | "\n" | "\r" } 

TOKEN : { 
    <REQUIRE: "+"> 
    | <FORBID: "-"> 
    | <FIND: "find"> 
    | <LPAREN: "("> 
    | <RPAREN: ")"> 
    | <STRING : (["A"-"Z", "0"-"9", "_", "*", "^", ".", "-"])+ > 
    | <QUOTED_STRING: "\"" (~["\""])+ "\"" > 
} 

/** Top level production. */ 
void request() : {} { 
    (findClause())? (queryTerm())* 
} 

void findClause() : { 
    Find find = new Find(); 
    Token tCategory, tProperty; 
} { 
    <FIND> 
    ":" 
    tCategory = category() { 
    find.setCategory(tCategory.image); 
    } 

    (":" tProperty = property() { 
    find.setProperty(tProperty.image); 
    } 
)? 

    { 
    query.setFind(find); 
    } 
} 

void expression() : {} { 
    queryTerm() ( queryTerm())* 
} 

void queryTerm() : { 
    Clause clause = new Clause(); 
    Token tString, tCategory, tProperty; 
} { 
    (<FORBID> { clause.setForbid(true); } | <REQUIRE> { clause.setRequire(true); })? 
    ((tCategory = category() { clause.setCategory(tCategory.image); } ":" (tProperty = property() { clause.setProperty(tProperty.image); } ":")?) | 
    (":" tProperty = property() { clause.setProperty(tProperty.image); } ":"))? 
    (tString = <STRING> { clause.setQuery(tString.image); } | tString = <QUOTED_STRING> { 
    clause.setQuery(tString.image.substring(1, tString.image.length() - 1)); }) 
    { query.getClauses().add(clause); }| 
    <LPAREN> expression() <RPAREN> 
} 

Token category() : { 
    Token tCategory; 
} { 
    tCategory = term() { return tCategory; } 
} 

Token property() : { 
    Token tProperty; 
} { 
    tProperty = term() { return tProperty; } 
} 

Token term() : { 
    Token tTerm; 
} { 
    tTerm = <STRING> { return tTerm; } 
} 

답변

1

당신은 문자열의 첫 번째 문자가 아니라면 "-" 만 포함되도록 <STRING>에 대한 규칙을 변경해야합니다. 예 :

<STRING : ["A"-"Z", "0"-"9", "_", "*", "^", "."](["A"-"Z", "0"-"9", "_", "*", "^", ".", "-"])* >