1

クエリ言語で次のような文字列を許可しようとしています。

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

1 に答える 1

1

文字列の最初の文字でない場合にのみ含まれる<STRING>ように、ルールを変更する必要があります。"-"何かのようなもの

<STRING : ["A"-"Z", "0"-"9", "_", "*", "^", "."](["A"-"Z", "0"-"9", "_", "*", "^", ".", "-"])* >
于 2012-12-09T06:10:58.827 に答える