2016-06-02 16 views
0

特定の言語用の小さなエディタを作成したいと思います。エディタでは、indentを1行または複数行(つまり、各行の左手に空白を追加)することができます。我々はまた、format全体のコード(すなわち、適切な場所に白いスペースと改行を変更すること)になることができます。ポジションをフォーマッタに保存する一般的な方法

私のフロントエンドはocamllexocamlyaccで、Abstract Syntax Tree (AST)を構築することができます。 ASTの要素の位置を保存する一般的な方法は何かを知りたい。

私はASTの各要素に(開始)positionを追加することを推測します。例えば、式の型は次のように定義されている場合:

type expression = 
    ... 
    | E_int of int 
    | E_function_EEs of Function.t * (expression list) 

それはなります:

type expression = 
    ... 
    | E_int of position * int 
    | E_function_EEs of position * Function.t * (expression list) 

その後、我々は各要素の長さを知っていれば、私たちはすべてのものの位置を推測することができますエディタで。そうするのが一般的な方法ですか?私はそれがいいとは思わない...

+0

当社のDMSツール店は、すべてのツリーノードに/行/列を提出します。これはいいね。 –

答えて

0

パターンごとにpositionを繰り返す必要はありません。あなただけのE_locのためのケースを追加することができ、expression上の既存の機能のために、結果として

type expression = 
    ... 
    | E_int of int 
    | E_function_EEs of Function.t * (expression list) 
    | E_loc of position * expression 

を、既存のケースに触れる必要はありません:あなたは最後に1を書くことができます。解析中

自動的E_locを構築するには、例えば.mlyに追加することができます。

loc(EXPRESSION): 
| t = EXPRESSION { E_loc (($startpos, $endpos), t) } 

(* immediate construction: *) 
expression: 
| INT { E_loc (($startpos, $endpos), E_int $1) } 

(* or delay construction: *) 
expression: 
| e0 = loc(expression) PLUS e1 = loc(expression) { E_function_EEs (Function.PLUS, [e0; e1]) } 
関連する問題