2014-02-21 1 views
0

У меня есть грамматика JavaCC со следующими определениями:JavaCC грамматика - собственно лексический

<REGULAR_IDENTIFIER : (["A"-"Z"])+ > // simple identifier like say "DODGE" 
<_LABEL : (["A"-"Z"])+ (":") > // label, eg "DODGE:" 
<DOUBLECOLON : "::"> 
<COLON : ":"> 

Прямо сейчас "DODGE ::" lexed в <_LABEL> <COLON> ("DODGE:" ":") , но мне нужно его ЛЕКС в <REGULAR_IDENTIFIER> <DOUBLECOLON> («DODGE» «::»)

ответ

0

В 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 производства ,

Надеюсь, это поможет.

+0

Проблема заключается в том, что <_LABEL> может произойти практически в любом месте, где может быть Это из синтаксиса T-SQL EG выберите * от Table1 Банни выберите * от Table1 Банни: первой линии - " Bunny "является псевдонимом таблицы вторая строка -« Bunny »- это метка В предыдущей версии грамматики я использовал тот же самый технику, что и вы, но было слишком много трудностей с другой частью грамматики. – Locky

+0

Если есть какие-либо правила SKIP , то это может не сработать. Например, пробелы пропускаются, тогда '' DODGE: "' будет рассматриваться как метка в решении @ jakobht, но как IDENTIFIER, за которым следует COLON в моем решении. Я предполагал, что последнее поведение - это то, чего хотел OP. –

1

Я думаю, что следующий будет работать

MORE: { < (["A"-"Z"])+ :S0 > } // Could be identifier or label. 
<S0> TOKEN: { <LABEL : ":" : DEFAULT> } // label, eg "DODGE:" 
<S0> TOKEN: { <IDENTIFIER : "" : DEFAULT > } // simple identifier like say "DODGE" 
<S0> TOKEN: { <IDENTIFIER : "::" { matchedToken.image = image.substring(0,image.size()-2) ; } : S1 > } 
<S1> TOKEN: { <DOUBLECOLON : "" { matchedToken.image = "::" ; } : DEFAULT> } 
<DOUBLECOLON : "::"> 
<COLON : ":"> 

Обратите внимание, что "DODGE :::" три лексемы, а не два.

+0

спасибо, пошла прочитанная документация – Locky

+0

Было ли мое решение работать? –

+0

«как есть» - к сожалению нет (синтаксические ошибки и т. Д.), Но я получаю идею, буду работать над ней – Locky

 Смежные вопросы

  • Нет связанных вопросов^_^