匹配文件名的Antlr规则

匹配文件名的Antlr规则,antlr,Antlr,我正在寻找一种很好的方法来匹配Antlr中的文件名 文件名可以是DOS或Unix样式 如果你有一个很好的解决方案,请忽略这个问题的其余部分,因为这只是我的新手试图解决这个问题,而我可能离这个问题还有很长的路要走。我之所以包含它,是因为有些人喜欢看到示例代码 为了讨论的目的,这里有一个我的想法。这不是我的实际语法,因为我对本次讨论感兴趣的只是文件名解析,所以我减少了在该上下文中有一定意义的示例 Lexer.g4: lexer grammar Lexer; K_COPY : C O P Y ; F

我正在寻找一种很好的方法来匹配Antlr中的文件名

文件名可以是DOS或Unix样式

如果你有一个很好的解决方案,请忽略这个问题的其余部分,因为这只是我的新手试图解决这个问题,而我可能离这个问题还有很长的路要走。我之所以包含它,是因为有些人喜欢看到示例代码

为了讨论的目的,这里有一个我的想法。这不是我的实际语法,因为我对本次讨论感兴趣的只是文件名解析,所以我减少了在该上下文中有一定意义的示例

Lexer.g4:

lexer grammar Lexer;
K_COPY : C O P Y ;

FILEPATH: [-.a-zA-Z0-9:/\]+;
Parser.g4

parser grammar Parser;
options { tokenVocab=Lexer; }

commandfile: (statement NEWLINE)* EOF;

statement : copy_stmt  
      ;

copy_stmt: K_COPY left=filepath right=filepath
     ;

// Add characters as we make rules as to what characters are valid:
filepath: FILEPATH;
这就是我的想法,但我是Antlr的新手,所以我想在继续之前得到一些反馈


我正在使用Antlr,因为这个项目已经确定,而且这个项目的很大一部分已经在使用Antlr,所以我只寻找基于Antlr的解决方案。

这是完整的语法吗?如果是这样的话,为什么要使用像ANTLR这样的重炮来完成如此简单的任务?我强烈怀疑你在这里有一个标记。@Lucastzesniewski我编辑了这个问题来回答你的评论。好吧,
filepath
规则需要是一个lexer规则,所以你需要一个
filepath
标记类型(它有自己的问题,比如不适用于名为
copy
的文件)。尽管如此,使用ANTLR进行此操作似乎是错误的。你最好问问自己真正的问题是什么,你可能会得到一些好的建议。在此之前,人们可能会建议一些解决方案,这些解决方案将适用于这个简单的示例,但不适用于您的实际代码(这就是为什么我将此作为一个注释来撰写)。@Lucastzesniewski感谢为FILEPATH创建Lexer规则的建议。我已经做到了。至于发布我的真实代码:a)我的公司不喜欢这样,b)其他人可能会抱怨我的样本太大,我应该把它简化成一些简单的东西。我将保留我的简单示例。您指出的问题是:无法处理名为COPY的文件是一个问题。在我的简单示例中,您有解决方案吗?当然,有几种解决方法是可行的(lexer模式,或者去掉
K_COPY
标记,可能使用谓词来区分命令和文件路径(命令毕竟也是文件路径),或者扩展内置lexer,等等),但是,我不知道哪种解决方案最适合你的问题,因为我不知道你剩下的语法是什么样子的。这是完整的语法吗?如果是这样的话,为什么要使用像ANTLR这样的重炮来完成如此简单的任务?我强烈怀疑你在这里有一个标记。@Lucastzesniewski我编辑了这个问题来回答你的评论。好吧,
filepath
规则需要是一个lexer规则,所以你需要一个
filepath
标记类型(它有自己的问题,比如不适用于名为
copy
的文件)。尽管如此,使用ANTLR进行此操作似乎是错误的。你最好问问自己真正的问题是什么,你可能会得到一些好的建议。在此之前,人们可能会建议一些解决方案,这些解决方案将适用于这个简单的示例,但不适用于您的实际代码(这就是为什么我将此作为一个注释来撰写)。@Lucastzesniewski感谢为FILEPATH创建Lexer规则的建议。我已经做到了。至于发布我的真实代码:a)我的公司不喜欢这样,b)其他人可能会抱怨我的样本太大,我应该把它简化成一些简单的东西。我将保留我的简单示例。您指出的问题是:无法处理名为COPY的文件是一个问题。在我的简单示例中,您有解决方案吗?当然,有几种解决方法是可行的(lexer模式,或者去掉
K_COPY
标记,可能使用谓词来区分命令和文件路径(命令毕竟也是文件路径),或者扩展内置lexer,等等),但是,我不知道哪种解决方案最适合你的问题,因为我不知道你剩下的语法是什么样的。