in src/Lucene.Net.QueryParser/Flexible/Standard/Parser/StandardSyntaxParser.cs [566:818]
public IQueryNode Term(string field)
{
Token term, boost = null, fuzzySlop = null, goop1, goop2;
bool fuzzy = false;
bool regexp = false;
bool startInc = false;
bool endInc = false;
IQueryNode q = null;
FieldQueryNode qLower, qUpper;
#pragma warning disable 612, 618
float defaultMinSimilarity = Search.FuzzyQuery.DefaultMinSimilarity;
#pragma warning restore 612, 618
switch ((jj_ntk == -1) ? Jj_ntk() : jj_ntk)
{
case RegexpToken.TERM:
case RegexpToken.REGEXPTERM:
case RegexpToken.NUMBER:
switch ((jj_ntk == -1) ? Jj_ntk() : jj_ntk)
{
case RegexpToken.TERM:
term = Jj_consume_token(RegexpToken.TERM);
q = new FieldQueryNode(field, EscapeQuerySyntax.DiscardEscapeChar(term.Image), term.BeginColumn, term.EndColumn);
break;
case RegexpToken.REGEXPTERM:
term = Jj_consume_token(RegexpToken.REGEXPTERM);
regexp = true;
break;
case RegexpToken.NUMBER:
term = Jj_consume_token(RegexpToken.NUMBER);
break;
default:
jj_la1[15] = jj_gen;
Jj_consume_token(-1);
throw new ParseException();
}
switch ((jj_ntk == -1) ? Jj_ntk() : jj_ntk)
{
case RegexpToken.FUZZY_SLOP:
fuzzySlop = Jj_consume_token(RegexpToken.FUZZY_SLOP);
fuzzy = true;
break;
default:
jj_la1[16] = jj_gen;
break;
}
switch ((jj_ntk == -1) ? Jj_ntk() : jj_ntk)
{
case RegexpToken.CARAT:
Jj_consume_token(RegexpToken.CARAT);
boost = Jj_consume_token(RegexpToken.NUMBER);
switch ((jj_ntk == -1) ? Jj_ntk() : jj_ntk)
{
case RegexpToken.FUZZY_SLOP:
fuzzySlop = Jj_consume_token(RegexpToken.FUZZY_SLOP);
fuzzy = true;
break;
default:
jj_la1[17] = jj_gen;
break;
}
break;
default:
jj_la1[18] = jj_gen;
break;
}
if (fuzzy)
{
// LUCENENET specific: parse without throwing exceptions
#if FEATURE_NUMBER_PARSE_READONLYSPAN
float fms = float.TryParse(fuzzySlop.Image.AsSpan(1), NumberStyles.Float, CultureInfo.InvariantCulture, out float temp) ? temp : defaultMinSimilarity;
#else
float fms = float.TryParse(fuzzySlop.Image.Substring(1), NumberStyles.Float, CultureInfo.InvariantCulture, out float temp) ? temp: defaultMinSimilarity;
#endif
if (fms < 0.0f)
{
{ if (true) throw new ParseException(QueryParserMessages.INVALID_SYNTAX_FUZZY_LIMITS); }
}
else if (fms >= 1.0f && fms != (int)fms)
{
{ if (true) throw new ParseException(QueryParserMessages.INVALID_SYNTAX_FUZZY_EDITS); }
}
q = new FuzzyQueryNode(field, EscapeQuerySyntax.DiscardEscapeChar(term.Image), fms, term.BeginColumn, term.EndColumn);
}
else if (regexp)
{
string re = term.Image.Substring(1, (term.Image.Length - 1) - 1);
q = new RegexpQueryNode(field, re, 0, re.Length);
}
break;
case RegexpToken.RANGEIN_START:
case RegexpToken.RANGEEX_START:
switch ((jj_ntk == -1) ? Jj_ntk() : jj_ntk)
{
case RegexpToken.RANGEIN_START:
Jj_consume_token(RegexpToken.RANGEIN_START);
startInc = true;
break;
case RegexpToken.RANGEEX_START:
Jj_consume_token(RegexpToken.RANGEEX_START);
break;
default:
jj_la1[19] = jj_gen;
Jj_consume_token(-1);
throw new ParseException();
}
switch ((jj_ntk == -1) ? Jj_ntk() : jj_ntk)
{
case RegexpToken.RANGE_GOOP:
goop1 = Jj_consume_token(RegexpToken.RANGE_GOOP);
break;
case RegexpToken.RANGE_QUOTED:
goop1 = Jj_consume_token(RegexpToken.RANGE_QUOTED);
break;
default:
jj_la1[20] = jj_gen;
Jj_consume_token(-1);
throw new ParseException();
}
switch ((jj_ntk == -1) ? Jj_ntk() : jj_ntk)
{
case RegexpToken.RANGE_TO:
Jj_consume_token(RegexpToken.RANGE_TO);
break;
default:
jj_la1[21] = jj_gen;
break;
}
switch ((jj_ntk == -1) ? Jj_ntk() : jj_ntk)
{
case RegexpToken.RANGE_GOOP:
goop2 = Jj_consume_token(RegexpToken.RANGE_GOOP);
break;
case RegexpToken.RANGE_QUOTED:
goop2 = Jj_consume_token(RegexpToken.RANGE_QUOTED);
break;
default:
jj_la1[22] = jj_gen;
Jj_consume_token(-1);
throw new ParseException();
}
switch ((jj_ntk == -1) ? Jj_ntk() : jj_ntk)
{
case RegexpToken.RANGEIN_END:
Jj_consume_token(RegexpToken.RANGEIN_END);
endInc = true;
break;
case RegexpToken.RANGEEX_END:
Jj_consume_token(RegexpToken.RANGEEX_END);
break;
default:
jj_la1[23] = jj_gen;
Jj_consume_token(-1);
throw new ParseException();
}
switch ((jj_ntk == -1) ? Jj_ntk() : jj_ntk)
{
case RegexpToken.CARAT:
Jj_consume_token(RegexpToken.CARAT);
boost = Jj_consume_token(RegexpToken.NUMBER);
break;
default:
jj_la1[24] = jj_gen;
break;
}
if (goop1.Kind == RegexpToken.RANGE_QUOTED)
{
goop1.Image = goop1.Image.Substring(1, (goop1.Image.Length - 1) - 1);
}
if (goop2.Kind == RegexpToken.RANGE_QUOTED)
{
goop2.Image = goop2.Image.Substring(1, (goop2.Image.Length - 1) - 1);
}
qLower = new FieldQueryNode(field,
EscapeQuerySyntax.DiscardEscapeChar(goop1.Image), goop1.BeginColumn, goop1.EndColumn);
qUpper = new FieldQueryNode(field,
EscapeQuerySyntax.DiscardEscapeChar(goop2.Image), goop2.BeginColumn, goop2.EndColumn);
q = new TermRangeQueryNode(qLower, qUpper, startInc ? true : false, endInc ? true : false);
break;
case RegexpToken.QUOTED:
term = Jj_consume_token(RegexpToken.QUOTED);
q = new QuotedFieldQueryNode(field, EscapeQuerySyntax.DiscardEscapeChar(term.Image.Substring(1, (term.Image.Length - 1) - 1)), term.BeginColumn + 1, term.EndColumn - 1);
switch ((jj_ntk == -1) ? Jj_ntk() : jj_ntk)
{
case RegexpToken.FUZZY_SLOP:
fuzzySlop = Jj_consume_token(RegexpToken.FUZZY_SLOP);
break;
default:
jj_la1[25] = jj_gen;
break;
}
switch ((jj_ntk == -1) ? Jj_ntk() : jj_ntk)
{
case RegexpToken.CARAT:
Jj_consume_token(RegexpToken.CARAT);
boost = Jj_consume_token(RegexpToken.NUMBER);
break;
default:
jj_la1[26] = jj_gen;
break;
}
int phraseSlop = 0;
if (fuzzySlop != null)
{
// LUCENENET specific: parse without throwing exceptions
#if FEATURE_NUMBER_PARSE_READONLYSPAN
if (float.TryParse(fuzzySlop.Image.AsSpan(1), NumberStyles.Float, CultureInfo.InvariantCulture, out float temp))
#else
if (float.TryParse(fuzzySlop.Image.Substring(1), NumberStyles.Float, CultureInfo.InvariantCulture, out float temp))
#endif
{
try
{
phraseSlop = (int)temp;
q = new SlopQueryNode(q, phraseSlop);
}
catch (Exception ignored) when (ignored.IsException())
{
/* Should this be handled somehow? (defaults to "no PhraseSlop", if
* slop number is invalid)
*/
}
}
}
break;
default:
jj_la1[27] = jj_gen;
Jj_consume_token(-1);
throw new ParseException();
}
if (boost != null)
{
// LUCENENET specific: parse without throwing exceptions
float f = float.TryParse(boost.Image, NumberStyles.Float, CultureInfo.InvariantCulture, out float temp) ? temp : 1.0f;
try
{
// avoid boosting null queries, such as those caused by stop words
if (q != null)
{
q = new BoostQueryNode(q, f);
}
}
catch (Exception ignored) when (ignored.IsException())
{
/* Should this be handled somehow? (defaults to "no boost", if
* boost number is invalid)
*/
}
}
{ if (true) return q; }
throw Error.Create("Missing return statement in function");
}