r-koubou/KSPSyntaxParser

BUG - Variable initializer expression (using with brackets)

Closed this issue · 2 comments

Sorry, written in Japanese and this bug is very difficult to solve..

本来KSPの言語仕様上問題がないが、以下の場合、初期化処理で誤検出をする

EXPECT/期待する動作

declare $num := ( 2 * 3 ) + 1  {OK}

NOW/現状

declare $num := (2 * 3 ) + 1  {NG:Syntax Error}

Workaround/回避方法

代入式の最初で括弧を使わない方法を検討してください。

declare $num := 7
or
declare $num := 2 * 3 + 1

Cause/原因

最初の式の括弧が【配列初期化子】なのか、【数学的な意味での括弧】なのかの判別が出来ない

declare $num := (2 * 3 ) + 1
{ この場合、(2*3)が配列初期化として誤検出されてしまう }

eBNFで初期化式を厳密に定義出来ていないため、構文解析フェーズでエラーになる。

強引にASTで表現すると、以下のようになる。KSPの仕様から逸脱した、支離滅裂な状況である。

                           < := >
                             +
                             |
                           < + >
                             |
                +------------+-----------+
                |                        |
       <Array Initializer>               1
                |
                + 
              < * > index[ 0 ]
                +
                |
            +--------+
            |        |
            2        3

Why difficult to solve / 修正困難な理由

最初の式の括弧が配列初期化子なのか、数学的な意味での括弧なのかの判別が出来ない。
解決するには、eBNFを書き直し、各種フェーズの処理を根本的に見直さなければならない

修正に伴う影響範囲を考えると、長時間の時間確保が必要であると考えている。

WIP: temporary fixes / 仮対応版

-> stable version (*NO SUPPORT)

Done. Apply to vsce 0.4.0