Я пытаюсь сделать сканер для 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.
Вы должны использовать JavaScript бежать характер: "\" перед строкой. –
Что такое «открытый» комментарий? В стандарте ECMAScript 5.1 упоминаются только два вида комментариев: singleLineComment и multilineComment. Если multlineComment не прекращается, разве это не ошибка и не бросает TokenMgrError разумную вещь для лексера? –