Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“如何实现JavaScript/ECMAScript”;“此处无线路终止符”;JavaCC中的规则?_Javascript_Ecmascript 5_Javacc - Fatal编程技术网

“如何实现JavaScript/ECMAScript”;“此处无线路终止符”;JavaCC中的规则?

“如何实现JavaScript/ECMAScript”;“此处无线路终止符”;JavaCC中的规则?,javascript,ecmascript-5,javacc,Javascript,Ecmascript 5,Javacc,我继续为我的工作。实际上进展得很顺利,我想我已经涵盖了大部分的表达 我现在有两个问题,它们都与自动分号插入有关(§7.9.1)。这是其中之一 本规范规定了以下生产: PostfixExpression : LeftHandSideExpression LeftHandSideExpression [no LineTerminator here] ++ LeftHandSideExpression [no LineTerminator here] -- 如何实施可靠的“此

我继续为我的工作。实际上进展得很顺利,我想我已经涵盖了大部分的表达

我现在有两个问题,它们都与自动分号插入有关(§7.9.1)。这是其中之一

本规范规定了以下生产:

PostfixExpression :
    LeftHandSideExpression
    LeftHandSideExpression [no LineTerminator here] ++
    LeftHandSideExpression [no LineTerminator here] --
如何实施可靠的“此处无线路终止符”检查?

记录在案,我的
行\u终止符目前类似于:

SPECIAL_TOKEN :
{
    <LINE_TERMINATOR: <LF> | <CR> | <LS> | <PS> >
|   < #LF: "\n" > /* Line Feed */
|   < #CR: "\r" > /* Carriage Return */
|   < #LS: "\u2028" > /* Line separator */
|   < #PS: "\u2029" > /* Paragraph separator */
}
特殊\u令牌:
{
|<#LF:“\n”>/*换行符*/
|<#CR:“\r”>/*回车*/
|<#LS:“\u2028”>/*行分隔符*/
|<#PS:“\u2029”>/*段落分隔符*/
}
我读过,但我不确定这是否是一个正确的方向。我检查了我找到的其他一些JavaScript语法,但没有发现任何类似的规则。(当我试图超越这些语法中的某些东西时,我真的觉得自己是个傻瓜。)

如果能给我一个指针、一个提示或者一个关键词,我会非常感激。我想对于“受限产品”,你可以这样做

void PostfixExpression() : 
{} {
     LeftHandSideExpression() 
     (
         LOOKAHEAD( "++", {getToken(0).beginLine == getToken(1).beginLine})
         "++"
     |
         LOOKAHEAD( "--", {getToken(0).beginLine == getToken(1).beginLine})
         "--"
     |
         {}
     )
}

更新正如Gunther指出的,由于规范7.4中的这一段,我的原始解决方案不正确:

注释的行为类似于空白,并且会被丢弃,但如果多行注释包含行终止符字符,则整个注释将被视为行终止符,以便于语法分析

我发布了一个更正,但在问题的末尾留下了我的原始解决方案

校正溶液 Theodore Norvell提出的核心思想是使用语义先行。但是,我决定实施更安全的检查:

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;
}
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.precededByLineTerminator(getToken(1))} )
    <INCR>
    {
        return expression.postIncr();
    }
|   LOOKAHEAD ( <DECR>, { !TokenUtils.precededByLineTerminator(getToken(1))} )
    <DECR>
    {
        return expression.postDecr();
    }
) ?
{
    return expression;
}
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;
}
语法是:

expression = LeftHandSideExpression()
(
    LOOKAHEAD ( <INCR>, { !TokenUtils.precededByLineTerminator(getToken(1))} )
    <INCR>
    {
        return expression.postIncr();
    }
|   LOOKAHEAD ( <DECR>, { !TokenUtils.precededByLineTerminator(getToken(1))} )
    <DECR>
    {
        return expression.postDecr();
    }
) ?
{
    return expression;
}
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;
}
expression=LeftHandSideExpression()
(
LOOKAHEAD(,{!TokenUtils.preforedbyspecialtokenofkind(getToken(1),LINE_TERMINATOR)})
{
返回表达式.postIncr();
}
|LOOKAHEAD(,{!TokenUtils.preforedbyspecialtokenofkind(getToken(1),LINE_TERMINATOR)})
{
返回表达式.postDecr();
}
) ?
{
返回表达式;
}

所以这里考虑
++
--
如果它们前面没有行终止符。

Hm,这是一个非常有趣的想法。我会尝试一下。或者可能
getToken(0).endLine==getToken(1).beginLine
。它是否也能处理行终止符隐藏在多行元素中的情况?ECMA-262规定在这种情况下也不允许这样做。@Gunther问得好。不,可能没有。我会查一查的。我想原来的提案应该涵盖了这个问题,不是吗?不久前,我构建了一个类似的东西,当时我支持自动插入分号。您可以通过查看由
-asi
生成的解析器中的followsLineTerminator()方法找到它on@Gunther原则上是的。但是,它假设解析器对换行符的理解与ES语法中的理解相同。我不是百分之百的相信这是事实。因此,这是另一个解决方案。@Gunther你是对的,我确实有一个bug,因为我缺少规范的那部分。现已更正,请参阅更新。谢谢你的洞察力!