2015-12-31 2 views
1

Я пытаюсь сделать сканер для Javascript с помощью JavaCC. У меня есть несколько проблем, один из которых - комментарии в стиле C: /* … */ Мне нужно вернуть комментарии в качестве токенов.Многострочные комментарии в JavaCC

Вот одна попытка:

TOKEN: {<MLCOMMENT:   "/*"  (~["*"] | ("*"(~["/"])?))* "*/">} 
TOKEN: {<MLCOMMENT_UNDELIM: ("/*"|"/*/") (~["/"] | (~["*"]"/") )*  >} 

MLCOMMENT был предназначен, чтобы соответствовать закрытые комментарии и MLCOMMENT_UNDELIM открытые комментарии. Это не работает, потому что /*a*/b*/ больше подходит для MLCOMMENT, чем /*a*/.

Вот еще одна попытка решить эту проблему:

MORE: 
{ 
    "/*" : WithinMLComment 
} 
<WithinMLComment> TOKEN : 
{ 
    < MLCOMMENT: "*/" > : DEFAULT 
} 
<WithinMLComment> MORE : 
{ 
    < ~[] > 
} 

Это не работает, либо так как открытый комментарий будет вызывать EOF в состоянии WithinMLComment. Это незаконно (TokenMgrError забрасывается).

Update: я, возможно, нашел решение:

TOKEN: {<MLCOMMENT:   ("/*"|"/*/") (~["/"] | (~["*"]"/"))* "*/">} 
TOKEN: {<MLCOMMENT_UNDELIM: ("/*"|"/*/") (~["/"] | (~["*"]"/"))*  >} 

Update 2: Это было не решение. /**// будет соответствовать MLCOMMENT_UNDELIM.

+0

Вы должны использовать JavaScript бежать характер: "\" перед строкой. –

+0

Что такое «открытый» комментарий? В стандарте ECMAScript 5.1 упоминаются только два вида комментариев: singleLineComment и multilineComment. Если multlineComment не прекращается, разве это не ошибка и не бросает TokenMgrError разумную вещь для лексера? –

ответ

2

Для многострочного комментария вы можете использовать

"/*" (~["*"])* "*" (~["*","/"] (~["*"])* "*" | "*")* "/" 

Для многострочного комментария, который отсутствует окончательный «* /», вы можете использовать

"/*" (~["*"] | ("*")+ ~["*","/"])* ("*")* 
+0

Для тех, кто ищет способ обработки комментариев в компиляторе, используйте решение, основанное на лексических состояниях. Решения здесь могут быть полезны для окраски кода, но они неверны в отношении определения языка. –