构建支持指定空格规则的ANTLR4表达式语法问询
解决ANTLR4参数表达式匹配的语法问题
我帮你调整了ANTLR4语法,完美匹配你需要的参数表达式规则——允许参数名、等号前后带空格,同时排除参数名包含空格的非法情况。以下是完整的修正语法:
grammar Test; prog : '{' WS? paramName WS? '=' WS? paramValue WS? '}' ; paramName : PARAM_NAME ; paramValue : TEXT_WITH_SPACES ; // 定义合法参数名:开头为字母(含俄文)或下划线,后续可跟字母、数字、下划线,无空格 PARAM_NAME : [A-Za-zА-Яа-я_] [A-Za-zА-Яа-я_0-9]* ; // 定义参数值:允许包含空格,直到遇到右大括号前的内容 TEXT_WITH_SPACES : ~[}\s]+ (WS ~[}\s]+)* ; // 空白字符(空格、制表符、换行):作为隐藏通道忽略,不参与语法匹配 WS : [ \t\r\n]+ -> skip ;
关键规则说明:
WS规则:专门处理空白字符并跳过,这样我们不用在每个语法节点里重复写空格匹配,同时通过WS?在prog规则里明确允许参数名、等号、参数值前后的可选空格,适配你提到的两种合法格式。PARAM_NAME规则:严格限制参数名只能由字母(含俄文)、下划线、数字组成,且不能包含空格,直接排除了{bad param=text}这类非法情况。TEXT_WITH_SPACES规则:允许参数值包含空格,但会在遇到右大括号}时停止匹配,避免把大括号纳入参数值内容。
测试验证:
- 合法输入1:
{paramName=simple text}→ 成功匹配 - 合法输入2:
{ paramName = simple text}→ 成功匹配 - 非法输入:
{bad param=text}→ 因bad param包含空格,不符合PARAM_NAME规则,语法解析报错
内容的提问来源于stack exchange,提问作者Andrei
相关产品推荐
相关产品推荐

