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
  ;