metafont语言是上下文无关语法吗?

metafont语言是上下文无关语法吗?,metafont,Metafont,metafont语言是上下文无关语法吗 我对lexer/parser/compiler的编写还不熟悉,我正试图了解编写元字体编译器有多难。事实并非如此。Metafont语言基本上是一个宏扩展器,在令牌流上运行。这是一个巧妙但非常复杂的设计,允许在运行时更改语法。象大多数语言一样,标记不是固定的,但它们是可变的,其含义可以在运行时更改 Metafont区分了作为变量名(名为tags)的一部分使用的标记和作为语法元素(名为sparks)使用的标记。当解析器遇到标记时,它首先查找标记的含义,然后再进行

metafont语言是上下文无关语法吗


我对lexer/parser/compiler的编写还不熟悉,我正试图了解编写元字体编译器有多难。

事实并非如此。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重新定义为带有 与+的含义相同。需要将begingroup括起来 表达式中的命令。当我们再次解析1plus5时,它 表示1+5,因此计算为6

metafont中的宏扩展非常复杂,它可以扩展变量, 但是sparks也可以包含宏,具有不同的扩展规则。 还有用于不同固定性的中缀函数的扩展器。 了解这一点的最好方法是阅读metafontbook