Я хотел сделать простой синтаксический анализатор для языка, подобного «псевдокоду» (оставаясь жестким), в Java.
Пример псевдокода будет -
//This is a comment
$x1 = readint
$x2 = readint
$dx = $x2 - $x1
#f = $dx / 2
if ($dx > 0)
{
loop while(#f > 1)
{
print(#f)
#f = #f / 2
}
}
Обратите внимание, что приведенный выше код является жестким в том смысле, что в строке не может быть более одного оператора, целые числа начинаются с $, числа с плавающей запятой начинаются с # и т. Д.
Для разбора такого кода сначала я могу использовать StringTokenizer
, а затем регулярное выражение, чтобы сопоставить целочисленные переменные, переменные с плавающей запятой или ключевые слова.
Этот подход хорош? Для операторов в цикле, как я могу хранить выражения, чтобы мне не приходилось токенизировать в каждой итерации?
Я мог бы подумать о преобразовании выражений (например, #f = #f / 2) в блочную нотацию, а затем о сохранении в стеке. И в каждой итерации, при выталкивании операндов я мог заменить значение для каждой переменной. Но достаточно ли это эффективно?
Заранее спасибо за любые предложения.