Может ли antlr или другой инструмент генерировать правильный код для данной грамматики? - PullRequest
0 голосов
/ 12 января 2019

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

Таким образом, свойство будет выглядеть как

data OtherValidJavaAst = undefined
data TreeSitterAst = undefined

transform : TreeSitterAst -> OtherValidJavaAst

genAst : Gen OtherValidAst

genCode : OtherValidAst -> String

parseTreeSitter : String -> TreeSitterAst

parsesEqually : ValidJavaAst -> Boolean
parsesEqually ast = transform (parseTreeSitter (genCode ast)) == ast

1 Ответ

0 голосов
/ 13 января 2019

То, что вы ищете, похоже, является генерацией предложений для данного языка. Кусок кода Java является предложением всего языка Java, в качестве примера. Однако из-за рекурсий и циклов количество допустимых предложений для данной грамматики фактически не ограничено даже для самых базовых грамматик. Следовательно, это сложно сделать, и я не знаю, какой инструмент это делает, за исключением одного, который я написал сам (как часть моего vscode ANTLR4 ), который, однако, все еще находится в разработке.

Однако вы можете ограничить процесс генерации подмножеством полного языка, ограничив рекурсии и итерации. Однако важным аспектом здесь является то, что является хорошим представлением языка?

Еще один момент здесь также: вы не можете использовать предложения, сгенерированные из грамматики, для проверки этой грамматики, поскольку это всегда будет успешно, поскольку предложения были сгенерированы из этой грамматики и, следовательно, должно быть действительным.

...