如何编写Antlr4语法规则以匹配文件路径?



编写 antlr4 语法以匹配文件路径的最佳方法是什么,例如

"C:UsersAlexIdeaProjectsCompiler_ProjectantlrTestsrcSQL.g4"

或相对路径,如

"Compiler_Project//samples//test.txt"

我的猜测是你正在尝试解析某种脚本语言,如bash或zsh。

我同意 Antlr 可能不是仅解析文件路径的最佳选择,但这不是您的问题,是吗?

下面是分析窗口批处理文件的较大语法的语法摘录。

值得注意的是,Antlr 可能不是解析 Windows 批处理命令的最佳选择,因为每个命令可能具有特殊的语法,这些语法并不容易应用于批处理文件中的所有命令。

这并不意味着你不能这样做! 在这里,我使用"岛屿语法"功能,该功能需要单独的lexer.g4和grammar.g4文件,但允许您将每个命令视为自己的小语法。

令牌重用有点尴尬,但并不可怕。

BatchLexer.g4

lexer grammar BatchLexer;
options { 
caseInsensitive=true; 
}
CD : ('CD' | 'CHDIR') -> pushMode(CD_CMD) ;
DOT         : '.' ;
DOTDOT      : '..' ;
BLANK_LINE  : NL ;
NL     : 'n';
OPTION : '/' [a-z]+? ;
DRIVE  : [a-z] ':' ; //posix?
WS     : [ tr]+ ->skip ;
// This introduces the type name, but doesn't match anything at this scope
PATH   : ~[.] ;
fragment ESCAPED_QUOTE : '\"' ;
fragment PATH_WORD : ~[ <>:/|rn]+ ;
fragment RAW_PATH : DRIVE? (DOT | DOTDOT | ESCAPED_QUOTE | PATH_WORD) ;
fragment QUOTED_PATH : '"' DRIVE? (DOT | DOTDOT | ESCAPED_QUOTE | PATH_WORD) '"' ;
mode CD_CMD ;
CD_OPTION : OPTION -> type(OPTION) ;
CD_PATH : (RAW_PATH | QUOTED_PATH) -> type(PATH) ;
CD_NL : NL -> type(NL), popMode ;
CD_WS : WS ->skip ;

批处理.g4

grammar Batch;
options { 
tokenVocab=BatchLexer;
caseInsensitive=true; 
}
file : (command)* EOF ;
command : (
cd_cmd
)? (NL | BLANK_LINE) ;
cd_cmd : CD OPTION? PATH*? ;

相关内容

  • 没有找到相关文章

最新更新