Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Scanner/Parser/Lexer进行脚本排序_Java_Javascript_Parsing_Lexer - Fatal编程技术网

Java 使用Scanner/Parser/Lexer进行脚本排序

Java 使用Scanner/Parser/Lexer进行脚本排序,java,javascript,parsing,lexer,Java,Javascript,Parsing,Lexer,我正在开发一个用Java实现的JavaScript collator/compositor。它是可行的,但必须有更好的方法来实现它,我认为Lexer可能是前进的方向,但我有点模糊 我已经为合成器开发了一个元语法,它是JavaScript语言的一个子集。就典型的JavaScript解释器而言,合成器元语法是合法的,只是不起作用(我使用同义词作为保留字的标签,后跟合成器应该解释的代码块)。现在,我正在使用scanner和regex查找源文件中的元语法,然后在检测合法表达式的基础上进行浅层词法转换 重

我正在开发一个用Java实现的JavaScript collator/compositor。它是可行的,但必须有更好的方法来实现它,我认为Lexer可能是前进的方向,但我有点模糊

我已经为合成器开发了一个元语法,它是JavaScript语言的一个子集。就典型的JavaScript解释器而言,合成器元语法是合法的,只是不起作用(我使用同义词作为保留字的标签,后跟合成器应该解释的代码块)。现在,我正在使用scanner和regex查找源文件中的元语法,然后在检测合法表达式的基础上进行浅层词法转换

重写的javascript和扫描器/解析器之间存在着紧密的耦合,我对此并不满意,因为重写的javascript使用了专门为此编写的对象支持库的功能,并且该库可能会发生更改

我希望我可以在Backaus Naur或EBNF中声明元语法,将其提供给lexer(ANTRL?),并根据在源文件中检测到的元语法表达式,将合成器定向到某些操作,例如将所需脚本前置到另一个脚本,声明变量,为适当参数化的库函数调用生成文本,甚至压缩脚本

这是制作合成器的合适方法吗?我是否应该使用Scanner/Parser/Lexer方法来合成JavaScript?感谢您的反馈-我不太确定从哪里开始:)

更新: 下面是一个更具体的示例-使用元语法的示例对象声明:

namespace: ie.ondevice
{
    use: ie.ondevice.lang.Mixin;
    use: ie.ondevice.TraitsDeclaration;

    declare: Example < Mixin | TraitsDeclaration
    {
        include: "path/to/file.extension";
        // implementation here
    }
 }

也许我在过度设计我的需求,但我真正想要的是一个事件驱动的collator——监听器可以松散地耦合到指令检测。

是的,使用解析器生成器(like)是IMO的一种方式。如果您提供一个更具体的示例,说明您试图解析的内容,可能是我(或其他人)我可以进一步帮助你

从一开始就创造了一些好的开始

编辑:

举个例子:

namespace: ie.ondevice
{
    use: ie.ondevice.lang.Mixin;
    use: ie.ondevice.TraitsDeclaration;

    declare: Example < Mixin | TraitsDeclaration
    {
        include: "path/to/file.extension";
        // implementation here
    }
}
将上述内容存储在名为
FJS.g
的文件ANTLR中,并让它生成您的lexer&parser,如下所示:

java -cp antlr-3.2.jar org.antlr.Tool FJS.g
要测试它,请运行以下命令:

public class ANTLRDemo {
    public static void main(String[] args) throws Exception {
        String source =
                "namespace: ie.ondevice                             \n"+
                "{                                                  \n"+
                "    use: ie.ondevice.lang.Mixin;                   \n"+
                "    use: ie.ondevice.TraitsDeclaration;            \n"+
                "                                                   \n"+
                "    declare: Example < Mixin | TraitsDeclaration   \n"+
                "    {                                              \n"+
                "        include: \"path/to/file.extension\";       \n"+
                "        // implementation here                     \n"+
                "    }                                              \n"+
                "}                                                    ";
        ANTLRStringStream in = new ANTLRStringStream(source);
        CommonTokenStream tokens = new CommonTokenStream(new FJSLexer(in));
        FJSParser parser = new FJSParser(tokens);
        parser.parse();
        System.out.println(parser.obj);
    }
} 
现在您可以让
FJSObject
类生成/重写元/源文件。从该类中,您还可以执行检查以查看包含的文件是否实际存在


HTH.

是的,使用parser generator(like)是IMO的一种方式。如果您提供一个更具体的示例,说明您试图解析的内容,也许我(或其他人)可以进一步帮助您

从一开始就创造了一些好的开始

编辑:

举个例子:

namespace: ie.ondevice
{
    use: ie.ondevice.lang.Mixin;
    use: ie.ondevice.TraitsDeclaration;

    declare: Example < Mixin | TraitsDeclaration
    {
        include: "path/to/file.extension";
        // implementation here
    }
}
将上述内容存储在名为
FJS.g
的文件ANTLR中,并让它生成您的lexer&parser,如下所示:

java -cp antlr-3.2.jar org.antlr.Tool FJS.g
要测试它,请运行以下命令:

public class ANTLRDemo {
    public static void main(String[] args) throws Exception {
        String source =
                "namespace: ie.ondevice                             \n"+
                "{                                                  \n"+
                "    use: ie.ondevice.lang.Mixin;                   \n"+
                "    use: ie.ondevice.TraitsDeclaration;            \n"+
                "                                                   \n"+
                "    declare: Example < Mixin | TraitsDeclaration   \n"+
                "    {                                              \n"+
                "        include: \"path/to/file.extension\";       \n"+
                "        // implementation here                     \n"+
                "    }                                              \n"+
                "}                                                    ";
        ANTLRStringStream in = new ANTLRStringStream(source);
        CommonTokenStream tokens = new CommonTokenStream(new FJSLexer(in));
        FJSParser parser = new FJSParser(tokens);
        parser.parse();
        System.out.println(parser.obj);
    }
} 
现在您可以让
FJSObject
类生成/重写元/源文件。从该类中,您还可以执行检查以查看包含的文件是否实际存在


HTH.

您可能希望了解该项目——这是一个在JVM上运行JavaScript的完整解决方案,但解析JavaScript代码的代码已被很好地封装,可以在没有完整执行功能的情况下使用。

您可能希望了解该项目——这是一个在JVM上运行JavaScript的完整解决方案,但是解析JavaScript代码的代码被很好地封装,可以在没有完整执行功能的情况下使用。

@Bart-感谢链接-我已经更新了帖子,对您的反馈非常感兴趣@Bart-我被说服了-这对我来说澄清了很多-特别是委托Java实例为我编写代码的策略-我期待着对此进行测试。我想问题已经解决了!没问题,孩子。如果您需要任何澄清,请告诉我。@Bart-谢谢您的链接-我已经更新了帖子,对您的反馈非常感兴趣@Bart-我被说服了-这对我来说澄清了很多-特别是委托Java实例为我编写代码的策略-我期待着对此进行测试。我想问题已经解决了!没问题,孩子。如果您需要任何澄清,请告诉我。我曾认为这是一种抽象的可能性,但我不确定我是否可以使用Rhino来整理javascript-AFAIK Rhino只能将javascript编译为Java-您知道原则上Rhino如何被用作可编程脚本压缩程序吗?我曾认为这是一种抽象的可能性,但是我不确定我是否可以使用Rhino来整理javascript——AFAIK Rhino只能将javascript编译成Java——你知道原则上Rhino如何被用作可编程脚本压缩程序吗?
public class ANTLRDemo {
    public static void main(String[] args) throws Exception {
        String source =
                "namespace: ie.ondevice                             \n"+
                "{                                                  \n"+
                "    use: ie.ondevice.lang.Mixin;                   \n"+
                "    use: ie.ondevice.TraitsDeclaration;            \n"+
                "                                                   \n"+
                "    declare: Example < Mixin | TraitsDeclaration   \n"+
                "    {                                              \n"+
                "        include: \"path/to/file.extension\";       \n"+
                "        // implementation here                     \n"+
                "    }                                              \n"+
                "}                                                    ";
        ANTLRStringStream in = new ANTLRStringStream(source);
        CommonTokenStream tokens = new CommonTokenStream(new FJSLexer(in));
        FJSParser parser = new FJSParser(tokens);
        parser.parse();
        System.out.println(parser.obj);
    }
} 
name      : Example
namespace : ie.ondevice
inherit   : Mixin
resemble  : [TraitsDeclaration]
use       : [ie.ondevice.lang.Mixin, ie.ondevice.TraitsDeclaration]
include   : ["path/to/file.extension"]