首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在LineTerminator中实现JavaScript/ECMAScript“无JavaCC这里”规则?

如何在LineTerminator中实现JavaScript/ECMAScript“无JavaCC这里”规则?
EN

Stack Overflow用户
提问于 2014-11-06 15:09:11
回答 2查看 213关注 0票数 2

我继续为我的JavaCC文法 ECMAScript 5.1工作。实际上进展得很好,我想我现在已经涵盖了大部分的表达。

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

该规范定义了以下产品:

代码语言:javascript
运行
复制
PostfixExpression :
    LeftHandSideExpression
    LeftHandSideExpression [no LineTerminator here] ++
    LeftHandSideExpression [no LineTerminator here] --

如何实现可靠的“这里没有LineTerminator”检查?

作为记录,我的LINE_TERMINATOR目前是这样的:

代码语言:javascript
运行
复制
SPECIAL_TOKEN :
{
    <LINE_TERMINATOR: <LF> | <CR> | <LS> | <PS> >
|   < #LF: "\n" > /* Line Feed */
|   < #CR: "\r" > /* Carriage Return */
|   < #LS: "\u2028" > /* Line separator */
|   < #PS: "\u2029" > /* Paragraph separator */
}

我读过关于词汇状态的文章,但我不确定这是否是一个正确的方向。我检查了我找到的其他几个JavaScript语法,但没有发现任何类似的规则。(当我试图超越这些语法时,我实际上感觉自己是一个货物运输共计。)

我会感激一个指针,一个提示,或只是一个关键字的正确的搜索方向。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-06 22:28:22

我认为对于“受限产品”你可以这样做

代码语言:javascript
运行
复制
void PostfixExpression() : 
{} {
     LeftHandSideExpression() 
     (
         LOOKAHEAD( "++", {getToken(0).beginLine == getToken(1).beginLine})
         "++"
     |
         LOOKAHEAD( "--", {getToken(0).beginLine == getToken(1).beginLine})
         "--"
     |
         {}
     )
}
票数 3
EN

Stack Overflow用户

发布于 2015-03-17 20:41:03

正如冈瑟所指出的,由于规范7.4中的这一段,我原来的解决方案是不正确的:Update

注释的行为像空格一样,被丢弃,除非MultiLineComment包含行终止符字符,那么为了语法解析目的,整个注释被认为是LineTerminator。

我发表了一篇更正文章,但在问题的末尾留下了我最初的解决方案。

校正解

Theodore Norvell提出的核心思想是使用语义前瞻性。然而,我决定实施一项更安全的检查:

代码语言:javascript
运行
复制
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;
}

语法是:

代码语言:javascript
运行
复制
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提出的核心思想是使用语义前瞻性。然而,我决定实施一项更安全的检查:

代码语言:javascript
运行
复制
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;
}

语法是:

代码语言:javascript
运行
复制
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;
}

所以这里考虑的是++--当且仅当它们的前面没有行终止符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26782747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档