背景
v0.2.1 で変数スコープ(@scopeTree/@declares/@backref)を導入したが、
MethodInvocation の @backref は偽陽性を避けるために一旦削除した。
メソッド名を正しく formula スコープに登録することで、
未定義メソッド呼び出しに WARNING を出せるようになる。
問題
現在の UBNF:
@scopeTree(mode=lexical)
MethodDeclaration ::= NumberMethodDeclaration | ... ;
@scopeTree が MethodDeclaration(choice ルール)にあると、
具体ルール(NumberMethodDeclaration 等)で @declares してもメソッド自身のスコープに入り、
leave() で破棄されてしまう。
解決策
@scopeTree を choice ルールから具体ルールに移し、
leave() → declare() の順序(onCommit での実行順)を利用して
メソッド名を親スコープ(formula スコープ)に登録する。
// Before
@scopeTree(mode=lexical)
MethodDeclaration ::= NumberMethodDeclaration | ... ;
// After
MethodDeclaration ::= NumberMethodDeclaration | ... ; // @scopeTree 削除
@scopeTree(mode=lexical)
@declares(symbol=methodName)
NumberMethodDeclaration ::=
NumberReturnType IDENTIFIER @methodName
'(' [ MethodParameters ] ')' '{' NumberExpression '}' ;
// (他の具体ルールも同様)
onCommit の実行順: leave() → declare() なので、
declare() 時点では method scope は既にポップ済み → formula scope に登録される。
効果
@backref(name=methodName) を MethodInvocation に復活させられる- 未定義メソッド呼び出しで WARNING が出る
- パラメータは引き続き method scope で管理される(
VariableRef から参照可能)
背景
v0.2.1 で変数スコープ(@scopeTree/@declares/@backref)を導入したが、
MethodInvocationの@backrefは偽陽性を避けるために一旦削除した。メソッド名を正しく formula スコープに登録することで、
未定義メソッド呼び出しに WARNING を出せるようになる。
問題
現在の UBNF:
@scopeTreeがMethodDeclaration(choice ルール)にあると、具体ルール(
NumberMethodDeclaration等)で@declaresしてもメソッド自身のスコープに入り、leave()で破棄されてしまう。解決策
@scopeTreeを choice ルールから具体ルールに移し、leave()→declare()の順序(onCommit での実行順)を利用してメソッド名を親スコープ(formula スコープ)に登録する。
onCommit の実行順:
leave()→declare()なので、declare()時点では method scope は既にポップ済み → formula scope に登録される。効果
@backref(name=methodName)をMethodInvocationに復活させられるVariableRefから参照可能)