具有非贪婪规则的ANTLR

具有非贪婪规则的ANTLR,antlr,grammar,antlr4,greedy,Antlr,Grammar,Antlr4,Greedy,我想要以下语法(部分): 它应该匹配像“abcdf”(不带引号)这样的东西,以及像“a、b和c”这样的东西 问题是我的规则StringSequence是贪婪的,并且会消耗OR/and。我尝试过不同的方法,但无法使我的语法以正确的方式工作。ANTLR4可以这样做吗?请注意,我不想在每个字符串周围加引号。放置引号效果良好,因为规则变得不贪婪,即: StringSequence : '"' StringCharacters? '"' ; 但这是一个幼稚的解决方案: StringSequence :

我想要以下语法(部分):

它应该匹配像“abcdf”(不带引号)这样的东西,以及像“a、b和c”这样的东西

问题是我的规则StringSequence是贪婪的,并且会消耗OR/and。我尝试过不同的方法,但无法使我的语法以正确的方式工作。ANTLR4可以这样做吗?请注意,我不想在每个字符串周围加引号。放置引号效果良好,因为规则变得不贪婪,即:

StringSequence
: '"' StringCharacters? '"'
;
但这是一个幼稚的解决方案:

StringSequence : 
  (StringCharacter | NotAnd | NotOr)+
;
fragment NotAnd :
  'AN' ~'D'
| 'A' ~'N'
;
fragment NotOr:
  'O' ~('R')
;
fragment StringCharacter :
  ~('O'|'A')
;
使用空格规则会变得更复杂一些。另一个解决方案是使用语义谓词向前看并防止读取关键字。

这是一个简单的解决方案:

StringSequence : 
  (StringCharacter | NotAnd | NotOr)+
;
fragment NotAnd :
  'AN' ~'D'
| 'A' ~'N'
;
fragment NotOr:
  'O' ~('R')
;
fragment StringCharacter :
  ~('O'|'A')
;
使用空格规则会变得更复杂一些。另一个解决方案是使用语义谓词向前看并防止读取关键字。

这是一个简单的解决方案:

StringSequence : 
  (StringCharacter | NotAnd | NotOr)+
;
fragment NotAnd :
  'AN' ~'D'
| 'A' ~'N'
;
fragment NotOr:
  'O' ~('R')
;
fragment StringCharacter :
  ~('O'|'A')
;
使用空格规则会变得更复杂一些。另一个解决方案是使用语义谓词向前看并防止读取关键字。

这是一个简单的解决方案:

StringSequence : 
  (StringCharacter | NotAnd | NotOr)+
;
fragment NotAnd :
  'AN' ~'D'
| 'A' ~'N'
;
fragment NotOr:
  'O' ~('R')
;
fragment StringCharacter :
  ~('O'|'A')
;

使用空格规则会变得更复杂一些。另一个解决方案是使用语义谓词向前看并防止读取关键字。

您没有空格规则,因此StringCharacter匹配除引号和反斜杠字符(+转义序列)以外的所有字符。包括空格规则,使其与单个和/或令牌匹配。此外,我建议为字符串文本(
和“
或“
)定义lexer规则,而不是将它们嵌入(解析器)规则中。通过这种方式,您不仅可以获得令牌的语音名称(而不是自动生成的名称),还可以更好地控制匹配顺序。

您没有空格规则,因此StringCharacter可以匹配除引号和反斜杠字符(+转义序列)以外的所有字符。包括空格规则,使其与单个和/或令牌匹配。此外,我建议为字符串文本(
和“
或“
)定义lexer规则,而不是将它们嵌入(解析器)规则中。通过这种方式,您不仅可以获得令牌的语音名称(而不是自动生成的名称),还可以更好地控制匹配顺序。

您没有空格规则,因此StringCharacter可以匹配除引号和反斜杠字符(+转义序列)以外的所有字符。包括空格规则,使其与单个和/或令牌匹配。此外,我建议为字符串文本(
和“
或“
)定义lexer规则,而不是将它们嵌入(解析器)规则中。通过这种方式,您不仅可以获得令牌的语音名称(而不是自动生成的名称),还可以更好地控制匹配顺序。

您没有空格规则,因此StringCharacter可以匹配除引号和反斜杠字符(+转义序列)以外的所有字符。包括空格规则,使其与单个和/或令牌匹配。此外,我建议为字符串文本(
和“
或“
)定义lexer规则,而不是将它们嵌入(解析器)规则中。通过这种方式,您不仅可以获得令牌的语音名称(而不是自动生成的名称),还可以更好地控制匹配顺序