Синтаксический анализ маркеров внутри строк в Antlr4


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

Например, если бы у меня был вход, такой как:

var1 = "world"
someVariable = "hello {{var1}}"

Результат, который я хочу, чтобы someVariable был равен "hello world".

Теперь я понимаю, как написать грамматику, чтобы установить переменную в строку, но я не могу понять, как разобрать эту строку для синтаксиса усов, чтобы ввести значение внутри var1.

Заранее спасибо!

2 2

2 ответа:

Это проще сделать в два этапа:

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

Это не то, что делает ANTLR. ANTLR может, конечно, разобрать ваш ввод, и даже маркировать "hello {{var1}}" отдельно1, но он не оценивает var1 и не заменяет его. Это то, что вам нужно будет сделать после того, как ANTLR закончит разбор2.

  1. проверьте документы по лексическим режимам: https://github.com/antlr/antlr4/blob/master/doc/lexer-rules.md#lexical-modes
  2. этот вопрос и ответ показывает простой пример, как оценить что-то с помощью посетителя: If / else операторы в ANTLR с использованием слушателей