2010-10-05 2 views
0

Я использую JavaCC для создания сложного парсера. В какой-то момент я хотел бы пропустить весь персонаж, которого я вижу, до желаемого токена в моей грамматике ... возьмем, например, следующиеParser в JavaCC и инструкции SKIP

/* bla bla bla bla bla bla bla bla */=> Я бы хотели бы определить вид грамматики как

<OPEN_COMMENT> SKIP ~[] until <CLOSE_COMMENT> Я хочу, чтобы это было правдой, даже если «бла» является регулярным лексем

Спасибо за вашу помощь

ответ

0

Вы можете сделать это с помощью регулярных выражений.

Вы можете определить маркеры и правила следующим образом:

TOKEN : 
{ 
< #DIGIT : [ "0"-"9" ] > 
| < #ALPHABET: ["a" - "z"] > 
| < #CAPSALPHABET: ["A" - "Z"] > 
| < WORD: (<DIGIT> | <ALPHABET> | <CAPSALPHABET>)+ > 
} 

String comment() : 
{ 
    Token token; 
} 
{ 
token=(<WORD>)+ 
{ 
    return token.toString(); 
} 
} 
+0

Да, это было то, о чем я думал сначала ... но проблема в том, что я беру вашу грамматику как подтверждение. Если я добавлю TOKEN: ': 'bla'', парсер вернет' 'вместо' '(в зависимости от того, какой из них был определен первым). и компилятор скажет: «Любопытно, слово« bla »будет сопоставляться с токеном' ' – BlackLabrador

+0

@BlackLabrador: я не могу четко понять вашу проблему. Можете ли вы дать более подробную информацию о своем ожидаемом выходе и вывести свой текущий синтаксический анализатор дает? Вы хотите идентифицировать комментарий, правильно? И можете ли вы также рассказать мне, что было результатом анализатора, используя грамматику в моем ответе? – athena

0

Я думаю, что обычная процедура здесь является использование лексического состояния с MORE и либо SKIP или SPECIAL_TOKEN. Вы можете увидеть пример этого в том, как комментарии обрабатываются грамматикой Java, которая поставляется с JavaCC source distribution.