我创建了一个语法,使用ANTLR4语法文件使用键和值对通过Map表示搜索:
START: 'SEARCH FOR';
VALUE_EXPRESSION: 'VALUE:'[a-zA-Z0-9]+;
MATCH: 'MATCHING';
COMMA: ',';
KEY_EXPRESSION: 'KEY:'[a-zA-Z0-9]*;
KEY_VALUE_PAIR: KEY_EXPRESSION MATCH VALUE_EXPRESSION;
r : START KEY_VALUE_PAIR (COMMA KEY_VALUE_PAIR)*;
WS: [ \n\t\r]+ -> skip;
"解释Lexer"在ANTLRWorks中产生:
" Parse Tree"像这样:
我不确定这是解析输入字符串的正确(甚至是典型)方式,但我想做的是将每个键/值对分开并且放在父节点下,如:
[SEARCH FOR] [PAIR], [PAIR]
| |
/ \ / \
/ \ / \
/ \ / \
colour red size small
我的信念是,在这样做时,当我走到树上时会更容易。
我已经四处搜索并尝试使用插入符号' ^'用于指定父级的字符,但ANTLRWorks始终表示我的语法中存在错误。
任何人都可以帮忙解决这个问题,或者可能提供另一种解决方案(如果这是一种非典型方法)?
答案 0 :(得分:0)
您可以进一步简化此操作。您可能希望为密钥设置LEXER规则以跟踪它们。所以下面,我只是使用字符串作为关键。但是你可以为'颜色','大小'等定义一个词法分析器规则......而且,我取消了匹配。相反,我创建了一组对。
grammar GRAMMAR;
start: START set ;
set
: pair (',' pair)*
;
pair: STRING ':' value ;
value
: STRING
| NUMBER
;
START: 'SEARCH FOR: ' ;
STRING : '"' [a-zA-Z_0-9]* '"' ;
NUMBER
: '-'? INT '.' [0-9]+ EXP? // 1.35, 1.35E-9, 0.3, -4.5
| '-'? INT EXP // 1e10 -3e4
| '-'? INT // -3, 45
;
fragment INT : '0' | [1-9] [0-9]* ; // no leading zeros
fragment EXP : [Ee] [+\-]? INT ; // \- since - means "range" inside [...]
WS : [ \t\n\r]+ -> skip ;