[英]ANTLR4: lexer rule for: Any string as long as it doesn't contain these two side-by-side characters?
有什么辦法可以在ANTLR4中表達這一點:
任何不包含星號的字符串,只要其后立即帶有正斜杠即可?
這不起作用: (~'*/')*
因為ANTRL會引發此錯誤: multi-character literals are not allowed in lexer sets: '*/'
這可行,但不正確: (~[*/])*
因為它禁止包含單個字符*
或/
的字符串。
我有類似的問題,我的解決方案是: ( ~'*' | ( '*'+ ~[/*]) )* '*'*
。
我能得到的最接近的結果是將測試放入解析器而不是詞法分析器中。 這並不是您所要的,但確實可以。
訣竅是在必須針對任何邪惡字符測試的任何字符串之前使用語義謂詞。 實際的測試是用Java完成的。
grammar myTest;
@header
{
import java.util.*;
}
@parser::members
{
boolean hasEvilCharacters(String input)
{
if (input.contains("*/"))
{
return false;
}
else
{
return true;
}
}
}
// Mimics a very simple sentence, such as:
// I am clean.
// I have evil char*/acters.
myTest
: { hasEvilCharacters(_input.LT(1).getText()) }? String
(Space { hasEvilCharacters(_input.LT(1).getText()) }? String)*
Period EOF
;
String
: ('A'..'Z' | 'a'..'z')+
;
Space
: ' '
;
Period
: '.'
;
通過NetBeans 8.0.1中ANTLRWorks 2中的TestRig在ANTLR 4.4中進行了測試。
如果不允許的序列很少,那么存在沒有解析器/詞法分析器動作的解決方案:
grammar NotParser;
program
: (starslash | notstarslash)+
;
notstarslash
: NOT_STAR_SLASH
;
starslash
: STAR_SLASH
;
STAR_SLASH
: '*'+ '/'
;
NOT_STAR_SLASH
: (F_NOT_STAR_SLASH | F_STAR_NOT_SLASH) +
;
fragment F_NOT_STAR_SLASH
: ~('*'|'/')
;
fragment F_STAR_NOT_SLASH
: '*'+ ~('*'|'/')
| '*'+ EOF
| '/'
;
這個想法是組成
有一些處理特殊情況的規則(多個' '后跟'/'或尾隨' ')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.