更新作爲岡瑟指出,我原來的解決方案是不正確的,由於該段在規範的7.4:
註釋的行爲與白色空間相似,只是如果MultiLineComment包含行結束符字符,則整個註釋將被視爲LineTerminator,以便通過語法語法進行分析。
我發佈了更正,但在問題結束時留下了原始解決方案。
更正解決方案
的核心理念,所提議的西奧多·諾維爾是使用語義向前看。不過我已經決定實施一個更安全的檢查:
public static boolean precededByLineTerminator(Token token) {
for (Token specialToken = token.specialToken; specialToken != null; specialToken = specialToken.specialToken) {
if (specialToken.kind == EcmaScriptParserConstants.LINE_TERMINATOR) {
return true;
} else if (specialToken.kind == EcmaScriptParserConstants.MULTI_LINE_COMMENT) {
final String image = specialToken.image;
if (StringUtils.containsAny(image, (char)0x000A, (char)0x000D, (char)0x2028,
(char)0x2029)) {
return true;
}
}
}
return false;
}
和語法是:
expression = LeftHandSideExpression()
(
LOOKAHEAD (<INCR>, { !TokenUtils.precededByLineTerminator(getToken(1))})
<INCR>
{
return expression.postIncr();
}
| LOOKAHEAD (<DECR>, { !TokenUtils.precededByLineTerminator(getToken(1))})
<DECR>
{
return expression.postDecr();
}
) ?
{
return expression;
}
所以++
或--
在此考慮當且僅當他們沒有行結束之前。
原液
這不是怎麼我終於解決了。
Theodore Norvell提出的核心思想是使用語義預測。不過我已經決定實施一個更安全的檢查:
public static boolean precededBySpecialTokenOfKind(Token token, int kind) {
for (Token specialToken = token.specialToken; specialToken != null; specialToken = specialToken.specialToken) {
if (specialToken.kind == kind) {
return true;
}
}
return false;
}
和語法是:
expression = LeftHandSideExpression()
(
LOOKAHEAD (<INCR>, { !TokenUtils.precededBySpecialTokenOfKind(getToken(1), LINE_TERMINATOR)})
<INCR>
{
return expression.postIncr();
}
| LOOKAHEAD (<DECR>, { !TokenUtils.precededBySpecialTokenOfKind(getToken(1), LINE_TERMINATOR)})
<DECR>
{
return expression.postDecr();
}
) ?
{
return expression;
}
所以++
或--
在此考慮當且僅當他們沒有行結束之前。
嗯,一個非常有趣的想法。我會嘗試一下。 – lexicore 2014-11-07 08:19:56
或者'getToken(0).endLine == getToken(1).beginLine'。 – 2014-11-08 00:05:04