2016-08-23 2 views
-1

Я пытался пробить Ply example calculator from Github.Ply пример калькулятор несколько выражений

Когда я запускаю калькулятор, он запускается внутри REPL. Как я могу использовать Ply, чтобы можно было оценивать несколько выражений один за другим.

Например, если я ввожу 3+4 РЕПЛ делает это:

calc > 3+4 
7 
calc > 

Если я вхожу 4+3 6+2 РЕПЛ делает это:

calc > 4+3 6+2 
Syntax error at '6' 
2 
calc > 

Как бы я изменить пример калькулятора, чтобы включить REPL для этого:

calc > 4+3 6+2 
7 
8 
calc > 

Нужно ли изменять грамматику r, анализатор или и то, и другое? Я пробовал модифицировать грамматику, чтобы она оставалась рекурсивной, но она не работает.

+0

Поскольку образец грамматики * уже * лево-рекурсивный, ваше утверждение, что вы пытались изменить его, чтобы быть леворекурсивным, требует некоторого разъяснения. (И почему вы думаете, что это изменило бы?) – rici

+1

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

+0

@ Two-BitAlchemist Честно говоря, я не. Я пытаюсь написать простой интерпретатор, используя Ply, и мой интерпретатор может в настоящее время оценивать только одно выражение/утверждение за раз. Я не хотел публиковать свой переводчик, так как он значительно длиннее, чем образец калькулятора. Я выбрал образец калькулятора, потому что у него есть то же ограничение, которое я пытаюсь выяснить, и он намного меньше. – Francis

ответ

1

Грамматика образца калькулятора позволяет выражать такие выражения, как - 42 (или -(4*8)+7). Если бы такое выражение было вторым выражением на линии, это создавало бы двусмысленность. Is:

calc > 4 * 3 -(4*8)+7 

одно или два слова?

Один из способов сделать однозначную грамматику состоял бы в том, чтобы разрешить несколько выражений на линии, разделенной запятой. Вы можете сделать это, просто добавив '.' в список литералов маркеров, а также размещение функции

def p_line(p): 
    '''line : statement 
      | line ',' statement''' 
    pass 

как первый функция анализатора (т.е. непосредственно перед p_statement_assign

С учетом этого изменения:.

$ python calc.py 
Generating LALR tables 
calc > 2+3 
5 
calc > 2+3,4+6 
5 
10 
calc > 2,3 
2 
3 
calc > a=2,a+7 
9 
+0

Спасибо! Это именно то, что я искал! Я даже не знал, что у вас может быть строка в грамматике без действия парсера. – Francis

+0

'pass' - это действие. Просто очень ленивый. – rici

Смежные вопросы