2016-09-05 79 views
2

目前正在開發一個小型的寵物項目,數學解析器/詞法分析器,並最終爲求解/學習而求解。我已經制定了一個基本的原型,現在正在將其轉換爲TypeScript來清理。對於那些感興趣的原型可以在這裏找到https://github.com/chips5k/math-solver-prototype數學解析器/詞法分析器 - 令牌接口設計

我試圖想出一個乾淨的基於界面的方法來處理我的令牌。我懷疑我看錯了這個方式,但希望有人能提供有用的建議。

在我的TS設計中,我有幾個接口,基本接口是Token,NumericToken和FunctionToken擴展了這些接口。然後我有幾個類實現這些接口,如:AdditionToken,VariableToken,NumberToken,PiToken,SineToken等...

我的問題是,爲了使用這些接口我最終需要方法來檢查基本類型例如isNumeric,isFunction,isVariable或者直接類型=== TokenFactory.NUMERIC等等......對我來說,這感覺不對,因爲它基本上使使用接口變得無關緊要。我懷疑有更好的/更清潔的多態性方法,我可以採取,但不幸的是,我沒有想法,一直無法找到我在做什麼的信息。

的,事情土崩瓦解的一個例子說明自己試圖解決一系列的令牌時:

if(t.isFunction()) { 
    var a = stack.unshift(); 
    var b = stack.unshift(); 
    if(a.isNumeric() && b.isNumeric()){ 
     result.push(tokenFactory.create(t.evaluate<number>(a.evaluate<number>, b.evaluate<number>)); 
    } else { 
    //return to stack and move on, e.g can't solve x + 1 directly 
    } 
} else { 
    stack.push(t); 
} 

基本上在尋找什麼被認爲是用於處理這樣的情況下理想的方法,我懷疑它可能成爲設計的替代方法。

TIA!

+0

我應該添加 - 上面的代碼片段純粹是爲了演示問題。 –

回答

1

基本型e.g ISNUMERIC,isFunction,isVariable或可替代的直下型=== TokenFactory.NUMERIC等等......這對我來說,感覺錯

都能跟得上。這是相當習慣的,因爲類型控制着那裏的功能。

例如,您將看到TypeScript checker.ts散佈在.kindSyntaxKind)上,其位於TypeScript AST節點鑑別器處。

另外,您可能需要考慮添加例如遞歸的訪問者。

function visit(item){ 

if (item.addition) { 
    return visit(item.left) + visit(item.right) 
} 

if (item.literal) { 
    return literal.value(); 
} 

// ETC. 
} 
+0

感謝您的反饋,我會看看checker.ts,我現在可以回到編碼:) –