将语义谓词与Python目标一起使用



我目前正在为我公司使用的一种专有语言的单元测试构建语法。

这种语言在某种程度上类似于Regex,例如F=bing*表示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'|'rn'))* (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')*;

当针对Python时,前瞻谓词的语法需要如下所示:

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

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

相关内容

最新更新