使用Python目标的语义谓词

时间:2015-12-04 10:51:08

标签: antlr antlr4

我目前正在为我公司使用的专有语言进行单元测试的语法。

这种语言在某种程度上类似于Regex,例如**表示可能重复bing。但是,单个grammar Pattern; element: ID | macro; macro: MACRONAME macroarg? REPEAT?; macroarg: '['( (element | MACROFREE ) ';')* (element | MACROFREE) ']'; and_con : element '&' element | and_con '&' element |'(' and_con ')'; head_con : 'H[' block '=>' block ']'; block : element | and_con | or_con | head_con | '(' block ')'; blocksequence : (block ' '+)* block; or_con : ((element | and_con) '|')+ (element | and_con) | or_con '|' (element | and_con) | '(' blocksequence (')|(' blocksequence)+ ')' REPEAT?; patternlist : (blocksequence ' '* ',' ' '*)* blocksequence; sentenceord : 'S=(' patternlist ')'; sentenceunord : 'S={' patternlist '}'; pattern : sentenceord | sentenceunord | blocksequence; multisentence : MS pattern; clause : 'CLS' ' '+ pattern; complexpattern : pattern | multisentence | clause | SECTIONS ' ' complexpattern; dictentry: NUM ';' complexpattern | NUM ';' NAME ';' complexpattern | COMMENT; dictionary: (dictentry ('\n'|'\r\n'))* (dictentry)? EOF; ID : ( '^'? '!'? ('F'|'C'|'L'|'P'|'CA'|'N'|'PE'|'G'|'CD'|'T'|'M'|'D')'=' NAME REPEAT? '$'? ) | SINGLESTAR REPEAT?; fragment SINGLESTAR: {_input.LA(-1)==' '}? '*'; fragment REPEATSTAR: {_input.LA(-1)!=' '}? '*'; fragment NAME: CHAR+ | ',' | '.' | '*'; fragment CHAR: [a-zA-Z0-9_äöüßÄÖÜ\-]; REPEAT: (REPEATSTAR|'+'|'?'|FROMTIL); fragment FROMTIL: '{'NUM'-'NUM'}'; MS : 'MS' [0-9]; SECTIONS: 'SEC' '=' ([0-9]+','?)+; NUM: [0-9]+; MACRONAME: '#'[a-zA-Z_][a-zA-Z_0-9]*; MACROFREE: [a-zA-Z!]+; COMMENT: '//' ~('\r'|'\n')*; 表示任意一个块,{{1}}表示任意数量的任意块。

我唯一的解决方案是使用语义谓词,检查前面的标记是否是空格。如果有人提出以不同方式解决此问题的建议,请分享!

否则,我的语法现在看起来像这样,但谓词似乎没有按预期工作。

{{1}}

1 个答案:

答案 0 :(得分:0)

在定位Python时,前瞻谓词的语法必须如下:

SINGLESTAR:{self._input.LA(-1)== ord('')}? ' *&#39 ;;

请注意,有必要添加" self。"引用该调用并使用ord()函数包装该字符,该函数返回一个unicode值以进行比较。严重缺乏Python目标的Antlr文档!