DOS命令下Antlr中的System语句无法执行的问题

原创 2014年03月01日 21:39:00

在学习Antlr的过程中,遇到了一个问题,花了好几天的时间才弄明白原因,所以写出来和大家共享一下。问题是:在.g的文件中加入一个输出语句,如图中所示。


本来的目标是想在DOS命令下,测试Antlr通过debug命令生成的__Test__.java文件,使其执行上图中所示的输出语句,即输入"int x;",想得到的输出是“int”,但是一直无法实现(在Antlr中可以实现)。

于是就开始分析原因:

我一开始使用的代码都是在debug模式下生成的,如图所示(绿色的甲壳虫),通过分析代码发现,在这种模式下生成的CminusParser.java文件里边的构造方法,如下所示:

而自动生成的测试文件__Test__.java中,调用CminusParser.java中的构造方法如下图所示:


发现了这一细节后,我有采用别的方式来生成代码,使用antlr的Generate –》Generate Code命令生成代码,发现CminusParser.java文件里边的构造方法,如下所示:


自己写的测试类中,调用CminusParser.java中的构造方法如下所示:

CminusParser g = new CminusParser(tokens);

最后测试通过了,原来是因为在两种方式下生成代码的构造方法的参数不一样。我只是发现了问题所在,但是具体的原理还没有搞明白,希望高手不吝赐教。


__Test__.java的代码如下:

import java.io.*;
import org.antlr.runtime.*;
import org.antlr.runtime.debug.DebugEventSocketProxy;


public class __Test__ {

    public static void main(String args[]) throws Exception {
        CminusLexer lex = new CminusLexer(new ANTLRFileStream("F:\\antlr\\output\\__Test___input.txt", "UTF8"));
        CommonTokenStream tokens = new CommonTokenStream(lex);

        CminusParser g = new CminusParser(tokens, 49100, null);
        try {
            g.program();
        } catch (RecognitionException e) {
            e.printStackTrace();
        }
    }
}

Test.java的代码如下:

import java.io.*;
import org.antlr.runtime.*;

public class Test {

	public static void main(String[] args) {
        CminusLexer lex = new CminusLexer(new ANTLRStringStream("int a;"));
        CommonTokenStream tokens = new CommonTokenStream(lex);

        CminusParser g = new CminusParser(tokens);
        try {
            g.program();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}



dos命令执行mysql的sql文件

1、cmd进入dos窗口 2、输入cd  mysql的bin目录后进入bin文件下 3、进入控制台:mysql -uroot -proot  回车 4、选择数据库:use mydata go 回...
  • zhu_nana
  • zhu_nana
  • 2015年11月20日 17:26
  • 1419

DOS窗口中直接运行cmd命令执行sql文件

有时我们会在没有装有相应数据库的情况下我们还是要去执行数据库语句 , 这时的数据库就是在别的电脑上,我们只需知道他数据库的IP地址,用户名,密码和所需用到的数据库名即可。 在dos下运行 :...
  • yuanbin4311
  • yuanbin4311
  • 2013年05月25日 18:40
  • 11003

对C++语言中dos命令的调用及system()函数使用方法的探究

C++ system()函数的使用方法探究
  • Goseqh
  • Goseqh
  • 2017年02月21日 14:49
  • 989

dos中for in后面执行多个命令的方法

dos中for命令算是一个复杂的命令了,
  • lyhDream
  • lyhDream
  • 2014年10月15日 23:10
  • 2365

MySql DOS中操作的常用SQL语句

操作MySQL 的相关语句 DOS窗口执行 一、连接MySQL格式: mysql -h 主机地址 -u用户名 -p用户密码例 1:连接到本机上的 MySQL。 mysql -uroot -pmysq...
  • lxf512666
  • lxf512666
  • 2016年10月14日 00:25
  • 689

在sql中执行dos命令

exec master..xp_cmdshell @cmd@cmd=需要执行的dos命令语句
  • fableking
  • fableking
  • 2007年06月01日 17:38
  • 1375

python 执行 dos 命令

在Python/wxPython环境下,执行外部命令或者说在Python程序中启动另一个程序的方法一般有这么几个: 1、os.system(command) 2、wx.Execut...
  • u013314786
  • u013314786
  • 2015年09月10日 14:35
  • 932

dos下at的应用

at计划在指定时间和日期在计算机上运行命令和程序。at 命令只能在“计划”服务运行时使用。如果在没有参数的情况下使用,则 at 列出已计划的命令。 语法 at [\\ComputerName...
  • cmdsystem
  • cmdsystem
  • 2011年11月16日 00:19
  • 2365

使用DOS命令无法插入中文数据到数据库的问题

今天再将项目放到服务器上,导入数据库,然后在用浏览器浏览的时候发现数中文数据读取不出来或者乱码的情况,经过一番查找,终于发现原因了,原来是使用Dos命令插入数据的时候中文数据没有插入进去,然后查看了d...
  • Kellogg_and_Nina
  • Kellogg_and_Nina
  • 2017年10月14日 14:21
  • 193

在DOS下的DEBUG命令的详细用法

名称 解释 格式 a (Assemble) 逐行汇编 a [address] c (Compare) 比较两内存块 c range address d (Dump) 内存16进制显示 d [addre...
  • xueyang214
  • xueyang214
  • 2006年05月06日 14:50
  • 1352
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DOS命令下Antlr中的System语句无法执行的问题
举报原因:
原因补充:

(最多只允许输入30个字)