Antlr 语法错误地抓住了一条错误的规则,尽管在该规则中没有';在我的文本中,我有';
我的语法如下Antlr 语法错误地抓住了一条错误的规则,尽管在该规则中没有';在我的文本中,我有';,antlr,antlr4,Antlr,Antlr4,我的语法如下 grammar STIXPattern; pattern : observationExpressions EOF ; observationExpressions : <assoc=left> observationExpressions FOLLOWEDBY observationExpressions #observationExpressionsFollowedBY | observationExpressionOr
grammar STIXPattern;
pattern
: observationExpressions EOF
;
observationExpressions
: <assoc=left> observationExpressions FOLLOWEDBY observationExpressions #observationExpressionsFollowedBY
| observationExpressionOr #observationExpressionOr_
;
observationExpressionOr
: <assoc=left> observationExpressionOr OR observationExpressionOr #observationExpressionOred
| observationExpressionAnd #observationExpressionAnd_
;
observationExpressionAnd
: <assoc=left> observationExpressionAnd AND observationExpressionAnd #observationExpressionAnded
| observationExpression #observationExpression_
;
observationExpression
: LBRACK comparisonExpression RBRACK # observationExpressionSimple
| LPAREN observationExpressions RPAREN # observationExpressionCompound
| observationExpression startStopQualifier # observationExpressionStartStop
| observationExpression withinQualifier # observationExpressionWithin
| observationExpression repeatedQualifier # observationExpressionRepeated
;
comparisonExpression
: <assoc=left> comparisonExpression OR comparisonExpression #comparisonExpressionOred
| comparisonExpressionAnd #comparisonExpressionAnd_
;
comparisonExpressionAnd
: <assoc=left> comparisonExpressionAnd AND comparisonExpressionAnd #comparisonExpressionAnded
| propTest #comparisonExpressionAndpropTest
;
propTest
: objectPath NOT? (EQ|NEQ) primitiveLiteral # propTestEqual
| objectPath NOT? (GT|LT|GE|LE) orderableLiteral # propTestOrder
| objectPath NOT? IN setLiteral # propTestSet
| objectPath NOT? LIKE StringLiteral # propTestLike
| objectPath NOT? MATCHES StringLiteral # propTestRegex
| objectPath NOT? ISSUBSET StringLiteral # propTestIsSubset
| objectPath NOT? ISSUPERSET StringLiteral # propTestIsSuperset
| LPAREN comparisonExpression RPAREN # propTestParen
;
startStopQualifier
: START TimestampLiteral STOP TimestampLiteral
;
withinQualifier
: WITHIN (IntPosLiteral|FloatPosLiteral) SECONDS
;
repeatedQualifier
: REPEATS IntPosLiteral TIMES
;
objectPath
: objectType COLON firstPathComponent objectPathComponent?
;
objectType
: IdentifierWithoutHyphen
| IdentifierWithHyphen
;
objectPathThl
: varThlType DOT firstPathComponent objectPathComponent?
;
varThlType
: IdentifierWithoutHyphen
| IdentifierWithHyphen
;
firstPathComponent
: IdentifierWithoutHyphen
| StringLiteral
;
objectPathComponent
: <assoc=left> objectPathComponent objectPathComponent # pathStep
| '.' (IdentifierWithoutHyphen | StringLiteral) # keyPathStep
| LBRACK (IntPosLiteral|IntNegLiteral|ASTERISK) RBRACK # indexPathStep
;
setLiteral
: LPAREN RPAREN
| LPAREN primitiveLiteral (COMMA primitiveLiteral)* RPAREN
;
primitiveLiteral
: orderableLiteral
| BoolLiteral
| objectPathThl
;
orderableLiteral
: IntPosLiteral
| IntNegLiteral
| FloatPosLiteral
| FloatNegLiteral
| StringLiteral
| BinaryLiteral
| HexLiteral
| TimestampLiteral
;
IntNegLiteral :
'-' ('0' | [1-9] [0-9]*)
;
IntPosLiteral :
'+'? ('0' | [1-9] [0-9]*)
;
FloatNegLiteral :
'-' [0-9]* '.' [0-9]+
;
FloatPosLiteral :
'+'? [0-9]* '.' [0-9]+
;
HexLiteral :
'h' QUOTE TwoHexDigits* QUOTE
;
BinaryLiteral :
'b' QUOTE
( Base64Char Base64Char Base64Char Base64Char )*
( (Base64Char Base64Char Base64Char Base64Char )
| (Base64Char Base64Char Base64Char ) '='
| (Base64Char Base64Char ) '=='
)
QUOTE
;
StringLiteral :
QUOTE ( ~['\\] | '\\\'' | '\\\\' )* QUOTE
;
BoolLiteral :
TRUE | FALSE
;
TimestampLiteral :
't' QUOTE
[0-9] [0-9] [0-9] [0-9] HYPHEN
( ('0' [1-9]) | ('1' [012]) ) HYPHEN
( ('0' [1-9]) | ([12] [0-9]) | ('3' [01]) )
'T'
( ([01] [0-9]) | ('2' [0-3]) ) COLON
[0-5] [0-9] COLON
([0-5] [0-9] | '60')
(DOT [0-9]+)?
'Z'
QUOTE
;
//////////////////////////////////////////////
// Keywords
AND: 'AND' ;
OR: 'OR' ;
NOT: 'NOT' ;
FOLLOWEDBY: 'FOLLOWEDBY';
LIKE: 'LIKE' ;
MATCHES: 'MATCHES' ;
ISSUPERSET: 'ISSUPERSET' ;
ISSUBSET: 'ISSUBSET' ;
LAST: 'LAST' ;
IN: 'IN' ;
START: 'START' ;
STOP: 'STOP' ;
SECONDS: 'SECONDS' ;
TRUE: 'true' ;
FALSE: 'false' ;
WITHIN: 'WITHIN' ;
REPEATS: 'REPEATS' ;
TIMES: 'TIMES' ;
// After keywords, so the lexer doesn't tokenize them as identifiers.
// Object types may have unquoted hyphens, but property names
// (in object paths) cannot.
IdentifierWithoutHyphen :
[a-zA-Z_] [a-zA-Z0-9_]*
;
IdentifierWithHyphen :
[a-zA-Z_] [a-zA-Z0-9_-]*
;
EQ : '=' | '==';
NEQ : '!=' | '<>';
LT : '<';
LE : '<=';
GT : '>';
GE : '>=';
QUOTE : '\'';
COLON : ':' ;
DOT : '.' ;
COMMA : ',' ;
RPAREN : ')' ;
LPAREN : '(' ;
RBRACK : ']' ;
LBRACK : '[' ;
PLUS : '+' ;
HYPHEN : MINUS ;
MINUS : '-' ;
POWER_OP : '^' ;
DIVIDE : '/' ;
ASTERISK : '*';
fragment HexDigit: [A-Fa-f0-9];
fragment TwoHexDigits: HexDigit HexDigit;
fragment Base64Char: [A-Za-z0-9+/];
// Whitespace and comments
//
WS : [ \t\r\n\u000B\u000C\u0085\u00a0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+ -> skip
;
COMMENT
: '/*' .*? '*/' -> skip
;
LINE_COMMENT
: '//' ~[\r\n]* -> skip
;
// Catch-all to prevent lexer from silently eating unusable characters.
InvalidCharacter
: .
;
语法模式;
图案
:观测表达式EOF
;
观测表达式
:observationExpressions跟随observationExpressions#observationExpressions跟随observationExpressions
|observationExpressionOr#observationExpressionOr_
;
观测表达式
:observationExpressionOr或observationExpressionOr#ObservationExpressionOrd
|观测表达式与#观测表达式与_
;
观测表达式与
:ObservationExpression AND ObservationExpression AND#ObservationExpression AND
|observationExpression#observationExpression_
;
观察表达
:LBRACK comparisonnexpression RBRACK#observationExpressionSimple
|LPAREN observationExpressions RPAREN#observationExpressionCompound
|observationExpression startStopQualifier#observationExpressionStartStop
|observationExpression within限定符#observationExpression within限定符
|observationExpression repeatedQualifier#observationExpression Repeated
;
比较加压
:Comparison下压或Comparison下压#Comparison下压红色
|比较下压和#比较下压和_
;
比较压力和压力
:Comparison下压和Comparison下压和#Comparison下压和
|propTest#比较加压和propTest
;
支撑试验
:objectPath不是吗?(EQ | NEQ)原语文字#propTestEqual
|对象路径不是吗?(GT | LT | GE | LE)orderableLiteral | propTestOrder
|对象路径不是吗?在setLiteral#propTestSet中
|对象路径不是吗?比如StringLiteral#propTestLike
|对象路径不是吗?匹配StringLiteral#propTestRegex
|对象路径不是吗?IsubSet StringLiteral#PropTestIsubSet
|对象路径不是吗?ISSUPERSET StringLiteral#propTestIsSuperset
|LPAREN比较压力RPAREN#propTestParen
;
startStopQualifier
:START TimestampLiteral STOP TimestampLiteral
;
内限定符
:在(IntPosLiteral | FloatPosLiteral)秒内
;
重复限定符
:重复IntPosLiteral时间
;
对象路径
:objectType冒号firstPathComponent objectPathComponent?
;
对象类型
:标识,不带连字符
|带连字符的标识符
;
对象路径
:varThlType DOT firstPathComponent objectPathComponent?
;
瓦思型
:标识,不带连字符
|带连字符的标识符
;
第一路径组件
:标识,不带连字符
|StringLiteral
;
objectPathComponent
:objectPathComponent objectPathComponent#pathStep
|“.”(标识符不带连字符| StringLiteral)#键路径步骤
|LBRACK(IntPosLiteral | IntNegLiteral |星号)RBRACK#indexPathStep
;
setLiteral
:LPAREN RPAREN
|LPAREN primitiveLiteral(逗号primitiveLiteral)*RPAREN
;
原始文字
:orderableLiteral
|布尔侧
|对象路径
;
orderableLiteral
:IntPosLiteral
|IntNegLiteral
|浮动posliteral
|浮动文本
|StringLiteral
|二芳基化合物
|六字文字
|时间戳文字
;
IntNegLiteral:
'-' ('0' | [1-9] [0-9]*)
;
IntPosLiteral:
'+'? ('0' | [1-9] [0-9]*)
;
浮动文本:
'-' [0-9]* '.' [0-9]+
;
FloatPosLiteral:
'+'? [0-9]* '.' [0-9]+
;
十六进制文字:
“h”引号为两个六位数*引号
;
双芳基化合物:
b报价
(Base64Char Base64Char Base64Char Base64Char Base64Char)*
((Base64Char Base64Char Base64Char Base64Char Base64Char)
|(Base64Char Base64Char Base64Char)'
|(Base64Char Base64Char)=='
)
引用
;
StringLiteral:
引号(~['\]\\\'\\'\\'\\\'\\\')*QUOTE
;
双边:
对|错
;
时间戳文字:
“t”字
[0-9][0-9][0-9][0-9]连字符
(('0'[1-9])|('1'[012])连字符
( ('0' [1-9]) | ([12] [0-9]) | ('3' [01]) )
“不”
([01][0-9])|('2'[0-3])冒号
[0-5][0-9]冒号
([0-5] [0-9] | '60')
(点[0-9]+)?
“Z”
引用
;
//////////////////////////////////////////////
//关键词
和:'和';
或:‘或’;
不是‘不是’;
FOLLOWEDBY:‘FOLLOWEDBY’;
像‘像’;
火柴:“火柴”;
ISSUPERSET:“ISSUPERSET”;
ISSUBSET:‘ISSUBSET’;
最后:“最后”;
IN:'IN';
开始:“开始”;
停止:'停止';
秒:“秒”;
真:‘真’;
假:‘假’;
内:"内";;
重复:“重复”;
时报:"时报",;
//在关键字之后,因此lexer不会将它们标记为标识符。
//对象类型可以有不带引号的连字符,但属性名称
//(在对象路径中)不能。
不带连字符的标识符:
[a-zA-Z_][a-zA-Z0-9_]*
;
带连字符的标识符:
[a-zA-Z_uz][a-zA-Z0-9_uuz-]*
;
等式:'='|'=';
NEQ:“!=”|“;
LT:'=';
引号:“\”;
冒号:':';
点:';
逗号:',';
RPAREN:')';
LPAREN:'(';
RBRACK:']';
LBRACK:'[';
加:“+”;
连字符:减号;
减:'-';
权力(OP):;
除法:“/”;
星号:'*';
片段六位数字:[A-Fa-f0-9];
片段两个六位数:六位数六位数;
片段Base64Char:[A-Za-z0-9+/];
//空白和注释
//
WS:[\t\r\n\u000B\u000C\u0085\u00a0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2008\u2029\u202f\u205f\u3000]+->跳过
;
评论
:“/*”.*?“*/”->跳过
;
行注释
:“/”~[\r\n]*->跳过
;
//捕获所有,以防止lexer默默地吃掉无法使用的字符。
无效字符
: .
;
因此,这里的IdentifierWithHyphen和IdentifierWithHyphen您可以看到我没有包含任何“所以我假设如果我输入像[file:created=t'2019-04-25T1:23:00.000Z']这样的文本,我仍然会看到orderableLiteral被触发,但令人惊讶的是,我看到这个objectPathThl在Primitivel中被触发
TimestampLiteral :
't' QUOTE
[0-9] [0-9] [0-9] [0-9] HYPHEN
( ('0' [1-9]) | ('1' [012]) ) HYPHEN
( ('0' [1-9]) | ([12] [0-9]) | ('3' [01]) )
'T'
( ([01] [0-9]) | ('2' [0-3]) ) COLON
[0-5] [0-9] COLON
([0-5] [0-9] | '60')
(DOT [0-9]+)?
'Z'
QUOTE
;