Rog*_*llo 5 import grammar parsing lexical-analysis antlr4
该import语句或tokenVocab选项可以放在一个解析器语法重用词法语法.
Sam Harwell建议总是使用tokenVocab而不是import[1].
有什么区别import和tokenVocab?如果没有区别(Sam说要使用tokenVocab),为什么要import声明呢?
[1]我实际上建议在ANTLR中完全避免使用import语句.请改用tokenVocab功能.[山姆哈威尔]
sky*_*489 11
首先,我们来谈谈import.
import与#includeC/C++语言类似的是什么,它将src复制到dst.如果存在冲突,ANTLR4将尝试合并两个语法.
使用import有点令人沮丧,因为有很多限制:
并非每种语法都可以导入其他类型的语法.
导入时,options语法将被忽略.
mode不允许使用词法分析器语法.因此,您实际上无法在解析器语法中导入词法分析器语法,因为它们不是同一类型.但是您可以在组合语法中导入词法分析器.
这些限制缩小了使用范围import.我认为最好的情况import是将大词法分析器或解析器语法分成几个部分,以便更容易管理.
现在,请记住我们不能使用解析器语法导入词法分析器语法import吗?这就是我们需要的原因tokenVocab,它旨在在解析器或组合语法中使用单独的词法分析器.
上述结论将是:
import.import导入另一个解析器语法.您只能使用tokenVocab另一个词法分析器语法.import和tokenVocab对于第三个,现在有什么不同?
区别在于使用tokenVocab需要首先编译词法分析器,因为tokenVocab它只是一个声明需要另一个语法的选项.虽然使用import不需要,因为它会将src复制到当前语法.
例如,有三个语法文件:
G1.g4
grammar G1;
r: B;
Run Code Online (Sandbox Code Playgroud)
G2.g4
grammar G2;
import G1
Run Code Online (Sandbox Code Playgroud)
G3.g4
grammar G3;
options { tokenVocab=G2; }
t: A;
Run Code Online (Sandbox Code Playgroud)
如果我们直接编译G2,那就OK了.但是如果我们尝试编译G3,就会出现错误:
错误(160):G3.g4:3:21:找不到令牌文件./G1.tokens
但是,如果我们先编译G1,就会有G1.tokens.现在编译G3会很成功.
| 归档时间: |
|
| 查看次数: |
3196 次 |
| 最近记录: |