2016-08-23 11 views
-1

我一直在嘗試Ply example calculator from GithubPly示例計算器多個表達式

當我運行計算器時,它運行在REPL內部。我將如何使用Ply來一次一個地評估多個表達式。

例如,如果我進入3+4的REPL做到這一點:

calc > 3+4 
7 
calc > 

如果我進入4+3 6+2的REPL做到這一點:

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)。如果這樣的表達是一條線上的第二個表達方式,那麼就會產生歧義。是:

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