好的...我有以下问题:
我需要解析(或标记)以下文本
ASK "Hey dude, what's about \";\"" + "?";
ASK "How old are you?" INTO inAge;
ASK "This is a
multiline String with \";\";" + " can you parse this?"; ANSWER "Sure, i can!";
在词法分析器中,我尝试使用模式:
ASK : 'ASK' -> pushMode(UNTILSEMI) ;
ANSWER : 'ANSWER' -> pushMode(UNTILSEMI) ;
mode UNTILSEMI;
ENDSEMI : ';'+ -> popMode ;
CONTENT : ~[;]+ ;
解析器将是:
askStmt: ASK CONTENT ENDSEMI;
answerStmt: ASNWER CONTENT ENDSEMI;
我的问题:当“字符串”内有分号时,分词器会停止并且解析器将无法工作..
我不知道如何开始。我应该直接操作词法分析器吗?我可以用词法分析器模式来做到这一点吗?
我不认为需要词汇模式。像这样的东西可以正确处理您的示例输入:
parse
: ( question | answer )* EOF
;
question
: ASK expression ( INTO ID )? SEMI
;
answer
: ANSWER expression SEMI
;
expression
: expression PLUS expression
| STRING
| ID
;
ASK : 'ASK';
ANSWER : 'ANSWER';
INTO : 'INTO';
ID : [a-zA-Z]+;
PLUS : '+';
SEMI : ';';
SPACES : [ \t\r\n]+ -> skip;
STRING : '"' ( ~[\\"] | '\\' . )* '"';