Написание переводчика, нужна помощь в представлении этих данных - PullRequest
1 голос
/ 17 сентября 2010

Я пишу небольшого переводчика, чтобы показать пример формы Бэкуса-Наура, и я хотел бы попросить помощи для представления некоторых данных.

<statement> : <assignment> | HALT | PRINT(<variable>)
<assignment> : <variable> = <expression>
<expression> : <term> | <term><operator><expression>
<term> : <number> | <variable>
<variable> : x | y | z
<operator> : + | -
<number> : 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

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

Ответы [ 2 ]

1 голос
/ 17 сентября 2010

Это похоже на простой синтаксический анализатор выражений с несколькими добавленными командами (PRINT и HALT).Вероятно, самый простой способ разобрать такую ​​вещь - это парсер рекурсивного спуска .Если вы создаете интерпретатор, вы можете либо интерпретировать выражение при разборе, либо построить постфиксное (или префиксное) представление выражения для последующей интерпретации.

0 голосов
/ 17 сентября 2010

Я бы использовал ОО подход:

public class State { /* ... */ }
public abstract class Statement {
  // ...
  public abstract void evaluate(State state);
  // ...
}

public class AssignmentStatement extends Statement {
  // ...
  private Variable var;
  private Expression expr;
  // ...
}

public class HaltStatement extends Statement { /* ... */}

public class PrintStatement extends Statement {
  private Variable var;
}

и так далее. В зависимости от того, сколько информации вам нужно связать с переменными (возможно, где они были объявлены, в какой строке и столбце это вхождение появилось и т. Д.), Вы можете избежать использования String s в качестве типа переменной и int s как тип вашего номера.

...