2013-03-12 2 views
0

Допустим, я хочу, чтобы разобрать мой новый язык, который выглядит следующим образом:Динамический анализатор - читать лексемы из отдельного файла

main.mylang

import "tags.mylang" 
cat dog bacon 

И есть еще один файл tags.mylang, который выглядит как это:

cat "meow" 
dog "woof" 
bacon "sizzle" 

Запуск main.mylang будет выводить

meow woof sizzle 

Проблема, с которой я сталкиваюсь, заключается в том, что «кошка», «собака» и «бекон» определены в отдельном файле, как реализовано моим разработчиком mylang; т. е. я не могу заранее сделать их частью грамматики.

Возможно ли динамическое добавление этих тегов в грамматику по мере ее разбора? Я не хочу добавлять подстановочный код \w+ или что-то, потому что я хочу, чтобы это ошибка на непризнанных тегах.

Редактировать: Я пишу это с использованием jison, который основан на bison.

+0

Как вы знаете, что тег непризнан, если это может быть переменная? Является ли ваша грамматика такой, что теги и переменные никогда не встречаются в одном контексте? Или теги считаются зарезервированными словами, хотя они могут время от времени меняться? – rici

+0

@rici: Тэги будут козырем переменных. Если для токена указан тег, то этот токен будет обрабатываться как тег, даже если есть также переменная с тем же именем. Похоже на то, как вы можете определить как функции, так и переменные с тем же именем на многих других языках. Однако я начинаю думать, что это плохая идея. Я мог бы просто предварять переменные с помощью '' 'как PHP или что-то в этом роде ... – mpen

+1

Я склонен согласиться с тем, что пропускать теги в имена переменных trump - отличная идея. Проблема в том, что «файлы тегов» не являются составными; поскольку вы должны знать, какие имена переменных не могут использоваться для написания «программы», вы не можете просто добавить новый файл тега в существующую программу. Кроме того, это затрудняет синтаксический цвет. С другой стороны, '' 'sigils уродливые. В любом случае, удачи. – rici

ответ

1

Вы можете использовать подстановочный знак \w+, который вы предлагаете, затем используйте YYERROR macro, чтобы повысить свою синтаксическую ошибку, когда семантическая логика вашего парсера обнаруживает нераспознанный/неопределенный тег.

+0

Это может сработать, но это означает, что у меня не может быть двух разных видов токенов, которые «выглядят одинаково». то есть, если оба «тега» и «переменные» определены как «\ w +», тогда синтаксический анализатор не сможет разделить их, потому что я не определяю их до времени синтаксического анализа. Кроме того, он не будет генерировать правильное дерево. – mpen

2

Я предполагаю, что теги соответствуют шаблону переменных, каков бы ни был шаблон. (\a\w*, может быть). Определить словарь, ключи которого являются тегами; значение может быть любым, что вы хотите связать с тегом. Насколько я понимаю, вы можете сделать этот словарь доступным как для синтаксического анализатора, так и для лексера, разместив его внутри объекта parser.yy.

Правило лексический переменных будет что-то вроде этого (я не знаю много о jison, так что это основано на бизонов + Flex):

{variable} if (yytext in yy.tags) { return TAG; } else { return VARIABLE; } 

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

В грамматике для файлов определения тегов вы можете добавить определение тега, просто добавив ключ и соответствующее значение в yy.tags.

+0

Это выглядит намного проще, чем я думал. Имеет смысл, спасибо! – mpen