-1

最終的にコードを解析してリファクタリングできるように、このツール antlr を試してみたかったのです。私はいくつかの小さな文法を試しましたが、すべて問題なかったので、次のステップに進み、ある種の単純な C# の解析を開始しました。
良いニュース: 基本を理解するのに 10 分ほどかかります。
非常に悪いニュース: 1 つではなく 2 つのスペースを解析する方法を理解するのに何時間もかかります。本当。このことは空白を嫌い、それをあなたに言うのは恥ではありません. 正直なところ、それらを解析できないと思い始めましたが、その後、何かがうまくいった...または少なくともそう思いました。

スペースの問題は、ANTLRWorks が 0.5 GB の RAM を割り当てようとして、実際には何も解析できないという事実の後に発生します。

私は初心者なので、文法はそれほど難しくありません。

grammar newEmptyCombinedGrammar;

TokenEndCmd : ';' ;
TokenGlobImport : 'import' ;
TokenGlobNamespace : 'namespace' ;
TokenClass : 'class' ;

TokenSepFloat : ',' ;
TokenSepNamespace : '.' ;

fragment TokenEmptyString : '' ;
TokenUnderscore : '_' ;

TokenArgsSep : ',' ;
TokenArgsOpen : '(' ;
TokenArgsClose : ')' ;
TokenBlockOpen : '{' ;
TokenBlockClose : '}' ;

// --------------------

Digit : [0-9] ;
numberInt : Digit+ ;
numberFloat : numberInt TokenSepFloat numberInt ;

WordCI : [a-zA-Z]+ ;
WordUP : [A-Z]+ ;
WordLW : [a-z]+ ;

// -----------------

keyword : (WordCI | TokenUnderscore+) (numberInt | WordCI | TokenUnderscore)* ;

// ---------------------

spaces : (' ' | '\t')+ ;
spaceLNs : (' ' | '\t' | '\r' | '\n')+ ;

spacesOpt : spaces* ;
spaceLNsOpt : spaceLNs* ;

// ---------------------

// tipo "System" o "System.Net.Socket"
namepaceNameComposited : keyword (TokenSepNamespace keyword)* ;

// import System; import System.IO;
globImport : TokenGlobImport spaces namepaceNameComposited spacesOpt TokenEndCmd ;

// class class1 {}
namespaceClass : TokenClass spaces keyword spaceLNsOpt TokenBlockOpen spaceLNsOpt TokenBlockClose ;

// "namespace ns1 {}", "namespace ns1.sns2{}"
globNamespace : TokenGlobNamespace spaces namepaceNameComposited spaceLNsOpt TokenBlockOpen spaceLNsOpt namespaceClass spaceLNsOpt TokenBlockClose ;

globFile : (globImport | spaceLNsOpt)* (globNamespace | spaceLNsOpt)* ;

しかし、globFileまたはglobNamespaceが追加されると、IDE は明日がないようにメモリを割り当て始めます。これは明らかに問題です。

そう

-空白を正しくキャプチャするこの方法はありますか? (私はそれらをスキップしたくありません、それがポイントです)
-私が見ていない再帰のためにメモリがリークしていますか?

このことが解析できるコードは次のようなものです。

import System;

namespace aNamespace{
    class aClass{
    }
}

globFileちなみにメインルールです。

4

2 に答える 2

1

問題は実質的に最後のルールです

globFile : (globImport | spaceLNsOpt)* (globNamespace | spaceLNsOpt)* ;

私はそれを次のように変更しました:

globFile : (globImport spaceLNsOpt)* (globNamespace spaceLNsOpt)* ;

そして、EOFを追加すると明らかに役立つようです:

globFile : (globImport spaceLNsOpt)* (globNamespace spaceLNsOpt)* EOF ;

しかし、これでは十分ではありません。ルールはどのような場合でも機能しません。

于 2013-05-03T13:13:13.157 に答える