- 论坛徽章:
- 0
|
本帖最后由 Solidus 于 2010-06-25 17:03 编辑
这问题是不是可以简化成 一个函数 返回值是语言类型,参数是字符串对吧?
如果是的话,理论上就比较容易,先说下纯理论上的实现,每个语言的语法都可以编成一个识别器,每次shift 一个token的时候,每个token在shift到某个识别器之前要探测一次其是否为该语法的关键字,会有0-N个识别器报错,则排除掉,剩下的继续shift下一个token,最后剩下的就是合法语言类型。
另一个问题是,例如你要识别java和C,但是整个输入仅仅含有int a = 8;会被Java和C的自动机同时识别,这时候你得确定一个优先级。这里的优先级是人为地,仅仅因为它们有公共子集。
但是具体实现上没搞过,按理说一个lookahead足够长的递归下降就可以了,ANTLR足以~~
凭直觉来想,应该有个预处理装置,在某一点上就可以确定其是什么语言,之后就没必要继续做了,
PS:又想了想,还有个问题,就是词法值在不同语言上定义也不太一样,这就麻烦了,例如某个语言inta=8;可以识别成int a = 8;但是在C中式inta = 8;这时候词法部分也得像语法那样穷举,每个有分歧点都分裂一次,一个是int a,一个是inta,这时候涉及到得问题就没那么容易了。也就是说,每个语言的词法也需要一个识别器,其失败,则语法识别器跟着失败,但是这里比较麻烦的是容错怎么办? |
|