元信息语言是一种无上下文语法吗?
我是词法分析器/解析器/编译器的新手,我试图大致了解编写元编译器的难度。
答案 0 :(得分:0)
不是。 Metafont语言基本上是一个在令牌流上运行的宏扩展器。它是一种巧妙但非常复杂的设计,允许语法在运行时更改。令牌不是固定的,就像它们在大多数语言中一样,但它们是变量,它们的含义可以在运行时更改。
Metafont区分用作变量名称的一部分的令牌(名为 tags )和作为句法元素(名为 sparks )。当解析器遇到标记时,它会在进行任何评估之前首先查找标记的含义。这导致在执行metafont程序期间令牌流的含义可能会完全改变!
在mf中采用以下示例:
$ mf
This is METAFONT, Version 2.718281 (TeX Live 2013/Debian)
**expr
(/usr/share/texlive/texmf-dist/metafont/base/expr.mf
gimme an expr: 1plus5
>> plus5
gimme an expr: begingroup let plus=+ endgroup
>> vacuous
gimme an expr: 1plus5
>> 6
令牌流1plus2
解析为1*plus2
,其中
plus2
是一个变量,因为plus
被定义为标记。
在第二个表达式中,我们将plus
重新定义为 spark
与+
的含义相同。 (begingroup
需要附上
表达式中的命令)。当我们再次解析1plus5
时,它
代表1 + 5
,因此评估为6
!
metafont中的宏扩展非常复杂,它可以扩展变量, 但是火花也可以包含宏,具有不同的扩展规则。 还有用于不同固定性的中缀功能的扩展器。 了解这一点的最佳方法是阅读 metafontbook 。