префикс токена javacc

Я пытаюсь разрешить такую ​​строку на моем языке запросов:

-some-hyphenated-term

где первый - указывает, что термин должен быть исключен. Проблема в том, что - в конечном итоге включается в текст токена, а не анализируется как токен исключения. Я уверен, что упускаю что-то легкое, но не могу понять этого.

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; }
}

person condit    schedule 06.12.2012    source источник


Ответы (1)


Вам нужно изменить свое правило для <STRING>, чтобы "-" включался только в том случае, если это не первый символ строки. Что-то типа

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