Нужна помощь в решении проблем регулярных выражений на языке программирования Scheme - PullRequest
1 голос
/ 05 марта 2012

Название, скорее всего, неоднозначно, что я действительно имею в виду, но у меня есть следующая проблема:

Рассмотрим грамматику для арифметических выражений, содержащих переменные x, y, z, и бинарные операторы +, *, приведенные ниже.

<expr>   ->  <term>   { + <term> } 
<term>   -> <factor>  { * <factor> } 
<factor> ->  <var>  |  ( <expr> ) 
<var>  ->  x | y| z  

Напишите функцию с именем executeer в Scheme, которая принимает строку выражения выводится из приведенной выше грамматики и выводит значение выражения, предполагая, что x, y и z равны 2, 4 и 8 соответственно. Например, звонок

(executer  "((x * x) + y * (z) + y)")

должно выдать 40. Ваша реализация должна определять нелегальные выражения и соответствовать с приоритетом «*» над «+».

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

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

Заранее спасибо за любую помощь, которую я получаю за это.

1 Ответ

5 голосов
/ 05 марта 2012

Подсказка: эта проблема состоит из двух частей:

  1. Создайте синтаксический анализатор, который принимает список, анализирует токены, создает синтаксическое дерево в виде списка.

  2. Создайте оценщик, который берет ваш разобранный AST и разрешает (выражение) в результат.

Начните с define-type, чтобы определить вашу грамматику.

Вы должны попытаться выяснить, как превратить 2+3 в (add (2 3)) и превратить это в 5.

Редактировать:

Найдена старая домашняя работа ...Вот первые несколько строк.Выбери, что не имеет значения;)

(define-type AE
  [num (n number?)]
  [mylist (lhs AE?) (rhs list?)]
  [myhead (n list?)]
  [mytail (n list?)]
  [add (lhs AE?) (rhs AE?)]
  [mult (lhs AE?) (rhs AE?)]
  [myconcat (lhs list?) (rhs list?)])
...