Parsing 解析字符串时如何处理Antlr空格
我需要解析一个字符串,这个字符串对于正则表达式来说太重了。Regex不太擅长找到平衡的匹配项。。。但任务相当简单,因为每个字符串可以有三种类型的信息:Parsing 解析字符串时如何处理Antlr空格,parsing,antlr4,lexer,Parsing,Antlr4,Lexer,我需要解析一个字符串,这个字符串对于正则表达式来说太重了。Regex不太擅长找到平衡的匹配项。。。但任务相当简单,因为每个字符串可以有三种类型的信息: 功能 变数 任意文本 我需要插入字符串,以便用程序生成的内容替换变量和函数,但要保留任意文本(包括空格) 我发现这是一个学习ANTLR的绝佳机会,但我正在努力让它发挥作用 我基本上有三个问题: 我需要保留空白,因为任意文本不会丢失 我希望函数中的参数不关心空格 我不知道如何匹配任意文本。我尝试过几种不同的选择,但没有一种适合我。例如,在lex
- 功能
- 变数
- 任意文本
+
,+?
,~[$,+?
将始终使用单个字符,因此请注意删除+?
部分
我有这样的想法:
语法输出;
开始
:expr*EOF
;
expr
:FUNC'('params')'
|出口(多部门)出口
|expr(加|减)expr
|变量
|忽略
;
params
:expr+(','expr+)*
;
忽视
:其他+
;
FUNC:“$”ID;
变量:“”;
开放式(PAR):"(""",;
接近(");;
MULT:“*”;
分区:“/”;
减:'-';
加:“+”;
其他:;
碎片ID:[a-zA-Z][a-zA-Z0-9:][*;
我刚刚看到了您自己的解决方案,但如果它按照您希望的方式工作,那就好了。那么应该删除函数括号内的空格吗?括号内的空格不重要。它们可以忽略。注意:为了复制原始文本,您不需要在lexer中保留空格。这仍然可用您可以使用返回标记中的字符索引从原始输入中提取一系列文本,包括所有空格+注释。啊。我不知道。谢谢@MikeLischkeIs任意文本应该也允许在函数调用内部还是仅允许在外部?也就是说,$f(,lalalala)
或$f(huhu-lala)
是允许的吗?或者就此而言,应该允许$f()
(两个变量之间没有逗号)吗?太好了。使用此解决方案,函数参数也被压平。使用我的方法,它形成了一个深层嵌套层次结构,具体取决于参数的数量。谢谢:)
grammar Output;
start
: (expr)* ;
expr
: expr expr
| VAR
| FUNC '(' commaexpr ')'
;
commaexpr
: expr
| commaexpr ',' commaexpr
;
FUNC: '$' ID ;
VAR : '<' ID '>' ;
fragment ID : [a-zA-Z] | [a-zA-Z][a-zA-Z0-9:]+ ;
WS : [\r\n]+ -> skip ;
grammar Output;
start
: (expr)* ;
expr
: expr expr
| variable
| function
| text
;
variable
: VAR
;
function
: FUNC '(' commaexpr ')'
;
commaexpr
: WS? expr WS?
| commaexpr ',' commaexpr
;
text: TEXT+ ;
FUNC: '$' ID ;
VAR : '<' ID '>' ;
fragment ID : [a-zA-Z] | [a-zA-Z][a-zA-Z0-9:]+ ;
TEXT: .+?;
NL : [\r\n]+ -> skip ;
WS: [ ]+ ;
grammar Output;
start
: expr* EOF
;
expr
: function
| variable
| text
;
function
: FUNC '(' params ')';
variable
: VAR;
params
: expr+ ( ',' expr+ )*
;
text
: OTHER+
;
FUNC : '$' ID;
VAR : '<' ID '>';
OPEN_PAR : '(';
CLOSE_PAR : ')';
COMMA : ',';
OTHER : . ;
fragment ID : [a-zA-Z] [a-zA-Z0-9:]* ;