在 Windows 系统下 JavaCC 的 Docker 镜像制作与运行方法

在 Windows 系统下 JavaCC 的 Docker 镜像制作与运行方法

简介

本文介绍如何制作一个可运行 JavaCC 的 Docker 镜像及该镜像的使用办法。

环境准备

笔者使用的是 Win10(版本1803)。

先下载好 Docker for windows 并安装,安装时选择 Linux Container。首次启动时会提示开启 Hyper-V,按提示开启即可。
注意,开启 Hyper-V 之后 virtualbox 将不能再使用。

安装 docker 后环境即准备完成。

制作

  1. 拉取 Ubuntu 镜像作为基准镜像。

     docker pull ubuntu:18.04
    
  2. 开启镜像开始配置

     docker run -it --name javacc ubuntu:18.04 /bin/bash
    

    上述命令中,-it 代表交互模式(–interactive + --tty),基于 ubuntu:18.04 镜像,并将 container 命名为 javacc,容器运行起来后将运行 /bin/bash 提供一个可交互 Shell.

  3. 在镜像中安装所需软件

     apt update
     apt install -y openjdk-8-jdk javacc dos2unix
    

    其中 openjdk 提供 java 环境。dos2unix 方便在 windows 下通过 docker 处理文件时调整文件换行符。

  4. 检查 javacc 安装结果

     javacc
    

    得到类似以下结果即为成功:

     root@4519e4f9abb7:/# javacc
     Java Compiler Compiler Version 5.0 (Parser Generator)
    
     Usage:
         javacc option-settings inputfile
    
     "option-settings" is a sequence of settings separated by spaces.
     Each option setting must be of one of the following forms:
    
         -optionname=value (e.g., -STATIC=false)
         -optionname:value (e.g., -STATIC:false)
         -optionname       (equivalent to -optionname=true.  e.g., -STATIC)
         -NOoptionname     (equivalent to -optionname=false. e.g., -NOSTATIC)
    
     Option settings are not case-sensitive, so one can say "-nOsTaTiC" instead
     of "-NOSTATIC".  Option values must be appropriate for the corresponding
     option, and must be either an integer, a boolean, or a string value.
    
     The integer valued options are:
    
         LOOKAHEAD              (default 1)
         CHOICE_AMBIGUITY_CHECK (default 2)
         OTHER_AMBIGUITY_CHECK  (default 1)
    
     The boolean valued options are:
    
         STATIC                 (default true)
         SUPPORT_CLASS_VISIBILITY_PUBLIC (default true)
         DEBUG_PARSER           (default false)
         DEBUG_LOOKAHEAD        (default false)
         DEBUG_TOKEN_MANAGER    (default false)
         ERROR_REPORTING        (default true)
         JAVA_UNICODE_ESCAPE    (default false)
         UNICODE_INPUT          (default false)
         IGNORE_CASE            (default false)
         COMMON_TOKEN_ACTION    (default false)
         USER_TOKEN_MANAGER     (default false)
         USER_CHAR_STREAM       (default false)
         BUILD_PARSER           (default true)
         BUILD_TOKEN_MANAGER    (default true)
         TOKEN_MANAGER_USES_PARSER (default false)
         SANITY_CHECK           (default true)
         FORCE_LA_CHECK         (default false)
         CACHE_TOKENS           (default false)
         KEEP_LINE_COLUMN       (default true)
    
     The string valued options are:
    
         OUTPUT_DIRECTORY       (default Current Directory)
         TOKEN_EXTENDS          (default java.lang.Object)
         TOKEN_FACTORY          (default none)
         JDK_VERSION            (default 1.5)
         GRAMMAR_ENCODING       (defaults to platform file encoding)
    
     EXAMPLE:
         javacc -STATIC=false -LOOKAHEAD:2 -debug_parser mygrammar.jj
    
  5. 使用 exit 退出容器然后 commit 变更

    exit
    
    docker commit --message "javacc done" javacc javacc:v1.0.0
    
  6. 测试做好的镜像。新建一个文件夹 tmp 然后在其中运行:

     docker run -it -v %CD%:/tmp/tests -w /tmp/tests --rm --name javacc_test javacc:v1.0.0 /bin/bash
     cat << 'EOF' > test.jj
     PARSER_BEGIN(Simple1)
    
     /** Simple brace matcher. */
     public class Simple1 {
    
       /** Main entry point. */
       public static void main(String args[]) throws ParseException {
         Simple1 parser = new Simple1(System.in);
         parser.Input();
       }
    
     }
    
     PARSER_END(Simple1)
    
     /** Root production. */
     void Input() :
     {}
     {
       MatchedBraces() ("\n"|"\r")* <EOF>
     }
    
     /** Brace matching production. */
     void MatchedBraces() :
     {}
     {
       "{" [ MatchedBraces() ] "}"
     }
    
     EOF
     javacc test.jj
     javac *.java
     java Simple1
    

    然后输入右大括号和左大括号 }{,再 Ctrl+D 结束,会得到下述提示,这样就是 JacaCC 成功运行了:

     }{Exception in thread "main" ParseException: Encountered " "}" "} "" at line 2, column 1.
     Was expecting one of:
         <EOF>
         "\n" ...
         "\r" ...
    
             at Simple1.generateParseException(Simple1.java:234)
             at Simple1.jj_consume_token(Simple1.java:172)
             at Simple1.Input(Simple1.java:38)
             at Simple1.main(Simple1.java:8)
    

使用

手动使用

# 交互式运行,--rm 参数是运行结束后就删除该容器。
docker run -it --rm --name javacc_test -v %CD%:/tmp/tests -w /tmp/tests javacc:v1.0.0 /bin/bash

# 从语法文件生成 java
javacc test.jj
# 从 java 生成可执行文件
javac *.java
# 运行可执行文件(这个可执行文件的名称与语法文件中的定义相关)
java Simple1

导出导入镜像

# 导出
docker save -o javacc_v1.0.0.tar javacc:v1.0.0

# 导入
docker load -i javacc_v1.0.0.tar

以上命令方便在内网机器中使用在外网制作好的镜像。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值