2014-12-11 2 views
0

Является ли язык метафонов контекстной бесплатной грамматикой?Является ли язык метафонов контекстной свободной грамматикой?

Я новичок в написании lexer/parser/compiler и пытаюсь получить общее представление о том, как сложно было бы написать компилятор metafont.

ответ

0

Это не так. Язык Metafont - это, в основном, макрорасширитель, работающий над потоком токенов. Это гениальный, но очень сложный дизайн, который позволяет изменять синтаксис во время выполнения. Токены не исправлены, как и на большинстве языков, но они являются переменными, их значение может быть изменено во время выполнения.

Metafont делает различие между лексемами, используемыми в качестве части имен переменных (названный тегов) и в качестве синтаксических элементов (названный искры). Когда парсер встречается с тегом, он сначала просматривает значение тега перед выполнением какой-либо оценки. Это приводит к тому, что смысл потока токенов может полностью измениться во время выполнения программы метафонов!

Рассмотрим следующий пример, в м-ф:

$ 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!

Макрообъем в метафоне очень сложный, он может расширять переменные, , но искры также могут содержать макросы, с разными правилами расширения. Существуют также расширители для функций infix различной фиксации. Лучший способ узнать об этом - прочитать metafontbook.

Смежные вопросы