私は、セル参照、範囲参照を識別し、要件に従ってそれらを色付けする必要がある 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);*/ } ;