编程语言
首页 > 编程语言> > 如何在JavaCC中实现JavaScript / ECMAScript“此处没有LineTerminator”规则?

如何在JavaCC中实现JavaScript / ECMAScript“此处没有LineTerminator”规则?

作者:互联网

我继续为ECMAScript 5.1JavaCC grammar进行工作.实际上进展顺利,我想我现在已经涵盖了大多数表达式.

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

该规范定义了以下产品:

PostfixExpression :
    LeftHandSideExpression
    LeftHandSideExpression [no LineTerminator here] ++
    LeftHandSideExpression [no LineTerminator here] --

如何实现可靠的“此处没有LineTerminator”检查?

为了记录,我的LINE_TERMINATOR目前类似:

SPECIAL_TOKEN :
{
    <LINE_TERMINATOR: <LF> | <CR> | <LS> | <PS> >
|   < #LF: "\n" > /* Line Feed */
|   < #CR: "\r" > /* Carriage Return */
|   < #LS: "\u2028" > /* Line separator */
|   < #PS: "\u2029" > /* Paragraph separator */
}

我已经读过约lexical states,但是我不确定这是否是正确的方向.我检查了我发现的其他一些JavaScript语法,但没有在其中找到任何类似的规则. (当我尝试从这些语法中超越某些东西时,我实际上感觉自己是total cargo culter.)

我会为正确的搜索方向提供一个指针,一个提示或只是一个关键字.

解决方法:

我认为对于“限产”,您可以这样做

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

标签:javascript,javacc,ecmascript-5
来源: https://codeday.me/bug/20191013/1909721.html