Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
acodercc opened this issue Dec 20, 2014 · 0 comments
Open

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

acodercc opened this issue Dec 20, 2014 · 0 comments
Assignees

Comments

@acodercc
Copy link
Owner

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

可行前缀计算使用场景:

对**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!!
*

@acodercc acodercc self-assigned this Dec 20, 2014
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant