В JavaCC максимального правила Мюнха (длинное правило матча префикса) используются см: http://www.engr.mun.ca/~theo/JavaCC-FAQ/javacc-faq-moz.htm#more-than-one
Это означает, что маркер _LABEL будет соответствовать, прежде чем т он REGULAR_IDENTIFIER, поскольку токен _LABEL будет содержать больше символов. Это означает, что то, что вы пытаетесь сделать, не должно выполняться в токенизаторе.
Я написал парсер, который распознает грамматику правильно, я использую анализатор для распознавания _LABEL-х, вместо Tokenizer:
options {
STATIC = false;
}
PARSER_BEGIN(Parser)
import java.io.StringReader;
public class Parser {
//Main method, parses the first argument to the program
public static void main(String[] args) throws ParseException {
System.out.println("Parseing: " + args[0]);
Parser parser = new Parser(new StringReader(args[0]));
parser.Start();
}
}
PARSER_END(Parser)
//The _LABEL will be recognized by the parser, not the tokenizer
TOKEN :
{
<DOUBLECOLON : "::"> //The double token will be preferred to the single colon due to the maximal munch rule
|
<COLON : ":">
|
<REGULAR_IDENTIFIER : (["A"-"Z"])+ > // simple identifier like say "DODGE"
}
/** Root production. */
void Start() :
{}
{
(
LOOKAHEAD(2) //We need a lookahead of two, to see if this is a label or not
<REGULAR_IDENTIFIER> <COLON> { System.err.println("label"); } //Labels, should probably be put in it's own production
| <REGULAR_IDENTIFIER> { System.err.println("reg_id"); } //Regulair identifiers
| <DOUBLECOLON> { System.err.println("DC"); }
| <COLON> { System.err.println("C"); }
)+
}
В действительности Вы должны причины перемещения <REGULAR_IDENTIFIER> <COLON>
к _label
производства ,
Надеюсь, это поможет.
Проблема заключается в том, что <_LABEL> может произойти практически в любом месте, где может быть Это из синтаксиса T-SQL EG выберите * от Table1 Банни выберите * от Table1 Банни: первой линии - " Bunny "является псевдонимом таблицы вторая строка -« Bunny »- это метка В предыдущей версии грамматики я использовал тот же самый технику, что и вы, но было слишком много трудностей с другой частью грамматики. –
Locky
Если есть какие-либо правила SKIP , то это может не сработать. Например, пробелы пропускаются, тогда '' DODGE: "' будет рассматриваться как метка в решении @ jakobht, но как IDENTIFIER, за которым следует COLON в моем решении. Я предполагал, что последнее поведение - это то, чего хотел OP. –