如何在JavaCC中实现JavaScript / ECMAScript“此处没有LineTerminator”规则?
作者:互联网
我继续为ECMAScript 5.1的JavaCC 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