读取所有字符,直到出现 ;但 noch 被“”括起来

问题描述 投票:0回答:1

好的...我有以下问题:

我需要解析(或标记)以下文本

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;

我的问题:当“字符串”内有分号时,分词器会停止并且解析器将无法工作..

我不知道如何开始。我应该直接操作词法分析器吗?我可以用词法分析器模式来做到这一点吗?

antlr antlr4
1个回答
0
投票

我不认为需要词汇模式。像这样的东西可以正确处理您的示例输入:

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 : '"' ( ~[\\"] | '\\' . )* '"';
© www.soinside.com 2019 - 2024. All rights reserved.