编写 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*? ;