Skip to content

可行前缀的计算已无可避免。 #17

@acodercc

Description

@acodercc

现在看来,基于当前符号栈的符号流,计算当前符号流是哪些产生式的可行前缀,已是无可避免必须要做的了。

可行前缀计算使用场景:

对**OfftendingToken(冒犯TOKEN)**的判定上,要使用可行前缀的概念。

定义:如果将下一个token压入符号栈,会导致符号栈中的符号流不是任何产生式的可行前缀,那么这个token就是OfftendingToken。
*使用:caliburn项目要解析javascript,需要自动补全分号,有一条规则,就是在遇到OfftendingToken时,前面有一个LineTerminator,将前面的LineTerminator换成semicolon,或者这个OfftendingToken是一个'}'时,要在前面补上一个semicolon。
*具体做法:因为移进归约表,标记了每个状态下面临下一个符号时,应该执行移进动作,还是执行归约动作,如果查表时没查到任何动作,说明此时符号栈出现了问题,面对下一个TOKEN不知该移进还是该归约,__所以,此时的符号栈一定不是可行前缀了!!
*

对**RestrictedToken(受限TOKEN)**的判定上,要使用可行前缀的概念。

定义:在es grammar描述中,特殊的文法修饰符号[noLineTerminator here]所出现的位置后面的token,被定义为RestrictedToken。
*使用:也是caliburn项目要解析javascript时,万恶的w3c es grammar中规定,在RestrictedToken前面如果出现了LineTerminator,则在该位置插入一个LineTerminator。
*具体做法:当归约时,判断当前归约的产生式的rhs符号中,是否有受限token,如果有的话,检查该受限token和前面的一个token之间,是否出现过被忽略的LineTerminator,如果出现过,则不使用该产生式进行归约,而是给输入流倒带,回退LineTerminator后面的TOKEN,然后符号栈也弹出相应的几个token,接下来,__给输入流倒带,手动回退进去一个LineTerminator!!
*

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions