java — генерирует два парсера для одного DSL

Мне нужно реализовать два инструмента для одного DSL: редактор пользовательского интерфейса на Java и интерпретатор на C / C ++. Моей первой идеей было использование ANTLR, поскольку он может генерировать парсеры как для Java, так и для C / C ++. Но все примеры ANTLR, которые я видел, содержат код или настройки для конкретного языка.

Есть ли способ генерировать два парсера для одного DSL?

Имеет ли смысл даже генерировать два парсера из одной грамматики?

Есть ли какие-либо общепринятые подходы к этой проблеме?

0

Решение

bison может создавать синтаксические анализаторы C ++ и Java, по крайней мере, согласно документации (я никогда не использовал интерфейс Java, а только один раз использовал интерфейс C ++, но мне сказали, что они работают). Грамматика не будет проблемой, но действия будут, особенно если учесть, что в двух парсерах вы, вероятно, делаете разные вещи, а не просто используете разные языки. Но вы должны быть в состоянии сделать каждое действие простым $$ = method($1, $2, ...); заявление.

bison не использует препроцессор C (++) (и на самом деле он не мог этого сделать, потому что обычно вводить директивы препроцессора во входные файлы bison), но вы могли бы использовать какую-то другую систему макросов — я не решаюсь рекомендовать m4 но он будет работать, если вы знаете, как его использовать — или сценарий оболочки для сборки различных входных файлов.

Другой возможностью было бы просто создать AST в парсере. Вы можете использовать любой генератор синтаксического анализатора, включая Antlr или bison, для создания анализатора AST на C или C ++, а затем обернуть результат для использования с JNI для Java. Если вы используете Antlr, вы можете создать генератор AST с очень небольшим языковым кодом, поэтому, используя простой макропроцессор, вы можете создавать собственные анализаторы AST как на C ++, так и на Java, я думаю. Но это зависит от того, достаточно ли прост ваш язык.

Я не знаю, существует ли «общепринятый подход» к этой проблеме, но это, безусловно, проблема, которая возникает довольно регулярно; множество грамматик распределяется между различными проектами, но из того, что я видел, наиболее распространенный подход — вырезать и вставлять грамматику и переписывать действия. Я пару раз использовал макроподход, и его можно заставить работать, но он никогда не был таким элегантным, как хотелось бы.

1

Другие решения

Вы можете попробовать YACC и JACC.
http://web.cecs.pdx.edu/~mpj/jacc/
http://dinosaur.compilertools.net/#yacc

Они имеют очень похожий синтаксис, может быть, с помощью некоторых
Инструмент предварительной обработки Hand Maid вы можете использовать один исходный файл.

PS
Но почему бы не написать парсер один раз в C ++ и использовать его через JNI?

0

Вы, конечно, можете использовать ANTLR. Части языка являются действиями или предикатами. Если они вам не нужны, то в грамматике у вас не будет ничего специфического для языка. Btw. независимо от используемого вами генератора синтаксического анализатора (в том числе yacc, bison и т. д.), в грамматике вы всегда найдёте материал для конкретного языка, если вам это нужно.

0