我有一個表示表達式的語法。比方說,爲了簡單起見,它是:通過生產規則向LALR(1)語法添加錯誤檢查以處理所有輸入
S -> E
E -> T + E | T
T -> P * T | P
P -> a | (E)
隨着a
,+
,*
,(
和)
是在我的英語字母,這個。
上述規則可以生成包含圓括號,乘法和加法的有效算術表達式,並使用正確的操作順序和關聯性。
我的目標是接受每個字符串,包含0個或更多字母的字母。以下是我的約束:
- 語法必須「接受」包含0個或多個字母的所有字符串。
- 可以引入新的終端並通過算法插入輸入。 (由於某種原因,我發現明確提供了一個
EOF
終端幫助檢測超出其他有效表達式的額外令牌時)。 - 可能會引入新的生產規則。新的規則將是錯誤標誌(即,如果字符串是使用一個進行分析的,那麼雖然字符串被接受,但它被認爲是語義上的錯誤)。
- 可以修改生產規則,以便插入新引入的終端。
- 語法應該是LALR(1)至少可以通過Lex/Yacc-like工具處理(如果我記得其他問題需要非LALR(1),儘管與Lex/Yacc兼容)。
此外,我想額外的規則,以對應不同類型的錯誤(缺少參數二元運算,括號缺失 - 向左或向右 - 額外的令牌(S)以外的其他方式接受,能表達,等等。 )。我說這是因爲可能有一些微不足道的方法來回答我的問題,以便「接受」所有不會對錯誤報告有益的輸入。
我發現這些規則是有用的,雖然我不知道他們是否違反我的制約,或不:
P -> @ [error]
P -> (E [error]
S -> E $ [instead of S -> E]
S -> E X $ [error]
X -> X Y [error]
X -> Y [error]
Y -> a [error]
Y -> ( [error]
Y ->) [error]
Y -> * [error]
Y -> + [error]
其中$
是明確EOF
令牌和@
是空字符串。
如果我的問題不明確:如何修改我的約束來實現我接受所有輸入的目標之內我的語法,最好的規則,一個很好的對應關係類型的錯誤?我的規則是否符合我的目標?
它仍然不清楚你想達到什麼:你想更準確的錯誤報告?你想建議用戶如何修復表達式中的語法錯誤? – 2015-02-20 12:22:48
這兩個都不錯。基本上這個想法是爲給定「表達式樹」語法(「表達式樹」沒有嚴格定義)開發一種算法,如何增加語法以提供良好的錯誤報告/建議。 – 2015-02-20 15:20:25