2

私は、セル参照、範囲参照を識別し、要件に従ってそれらを色付けする必要がある Web スプレッドシートの編集機能に取り組んでいます。セル参照を識別して色付けすることはできますが、ドル ('$') 記号を入力した後にエラーがスローされるため、固定セル参照 ($a$1、$a1、a$1 など) を識別できませんでした。誰でもこれについて私を助けることができますか?

セル参照を "$A$1" として入力しようとすると、行参照に 2 番目のドル記号を入力した後、実行可能な例外がスローされず、理由がわかりません。固定セル参照を認識するために「$」記号を読み取る方法は?

参考までに、@ antlr3で見つかった文法を拡張しました- 解析ツリーの生成

以下のように、セル/範囲参照に文法を使用しています

CELLREFERENCE
    :  '$'?('a'..'z'|'A'..'Z')+'$'?('0'..'9')+
    ;

RANGEREFERENCE
    : '$'?('a'..'z'|'A'..'Z')+'$'?('0'..'9')+ ':' '$'?('a'..'z'|'A'..'Z')+'$'?('0'..'9')+
    ;

This will work for identifying the colon,

RANGEREFERENCE : CELLREFERENCE ((':' CELLREFERENCE)=> ':' CELLREFERENCE)?;

Still not sure about the '$' issue in cell reference.

ここで完全な文法を見つけてください:

grammar Excel;

options {
  output=AST;
  language=JavaScript;
}

tokens {
    // define pseudo-operations
    FUNC;
    CALL;
    NEGATE;
}

parse
  :  exp EOF -> exp
  ;

exp
  :  orExp
  ;

orExp
  :  andExp (OR^ andExp)*
  ;

andExp
  :  eqExp (AND^ eqExp)*
  ;

eqExp
    : relExp (( EQUALS | NOTEQUALS)^ relExp)*
    ;

relExp
    : addExp ( (LT^|LTEQ^|GT^|GTEQ^) addExp)*
    ;

addExp
    : multExp ( (PLUS^| MINUS^) multExp)*
    ;
multExp 
    : unaryExp (( MULT^ | DIV^ | MOD^ |POW^| IS^) unaryExp)*
    ;

unaryExp
  :  NOT atom -> ^(NOT atom)
  |  MINUS atom -> ^(NEGATE atom)
  |  ASSIGN atom -> ^(ASSIGN atom)
  |  atom
  ;

atom
  :  TRUE
  |  FALSE
  |  INT
  |  FLOAT
  |  function
  |  CELLREFERENCE
  |  RANGEREFERENCE
  |  '(' exp ')' -> exp
  ;

POW : '^';
DIV : '/';
MOD : '%';
MULT : '*';
PLUS : '+';
MINUS : '-';
LT   : '<';
LTEQ : '<=';
GT   : '>';
GTEQ : '>=';
EQUALS : '==';
ASSIGN: '=';
NOTEQUALS : '<>';
INT    : '0'..'9'+;
FLOAT  : ('0'..'9')* '.' ('0'..'9')+;
OR     : 'or' ;
AND    : 'and' ;
IS     : 'is' ;
NOT    : 'not' ;
TRUE   : 'true' ;
FALSE  : 'false' ;

function
    :   IDENT '(' ( exp (',' exp)* )? ')' -> ^(FUNC IDENT (exp)*)
    ;
CELLREFERENCE
    :  '$'?('a'..'z'|'A'..'Z')+'$'?('0'..'9')+
    ;

RANGEREFERENCE
    : '$'?('a'..'z'|'A'..'Z')+'$'?('0'..'9')+ ':' '$'?('a'..'z'|'A'..'Z')+'$'?('0'..'9')+
    ;

IDENT
    :   ('a'..'z' | 'A'..'Z') ('a'..'z' | 'A'..'Z' |'0'..'9')*
    ;   

SPACE  : (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;} ;

ERRCHAR : Err =. { /*console.log($Err);*/ } ;
4

1 に答える 1

1

再現できません。

元の文法を(述語なしで)コピーして貼り付け、ルールを次のよう( ... )=>に変更します。parse

parse
  :  (t=. {console.log('type:', $t.type, 'text:', $t.text);})* EOF
     //exp EOF -> exp
  ;

次に、レクサー/パーサーを生成します。

java -cp antlr-3.3-complete.jar org.antlr.Tool Excel.g

テストhtmlファイルを使用します。

<html>
  <head>
    <script type="text/javascript" src="antlr3-all-min.js"></script>
    <script type="text/javascript" src="ExcelLexer.js"></script>
    <script type="text/javascript" src="ExcelParser.js"></script>    
    <script type="text/javascript">

    function init() {
      var evalButton = document.getElementById("eval");
      evalButton.onclick = evalExpression;
    }

    function evalExpression() {
      document.getElementById("answer").innerHTML = "";
      var Excelression = document.getElementById("src").value;
      if(Excelression) {
        var lexer = new ExcelLexer(new org.antlr.runtime.ANTLRStringStream(Excelression));
        var tokens = new org.antlr.runtime.CommonTokenStream(lexer);
        var parser = new ExcelParser(tokens);
        parser.parse().getTree();
      }
    }

    </script>
  </head>
  <body onload="init()">
    <input id="src" type="text" size="35" />
    <button id="eval">evaluate</button>
    <div id="answer"></div>
  </body>
</html>

次に、テキストフィールドに入力$a$1 $a$1:$a$9を入力すると、Chromeコンソールに次の出力が出力されます。

タイプ:28テキスト:$ a $ 1
タイプ:29テキスト:$ a $ 1:$ a $ 9

ここで、Excel.tokensファイルには次のものが含まれています。

CELLREFERENCE = 28
RANGEREFERENCE = 29
于 2013-01-17T19:14:33.640 に答える