├── start ├── test.groovy ├── compiler.groovy └── wenyan.sh ├── .idea ├── .name ├── wenyan-lang_jvm.iml ├── dictionaries │ └── luchangcun.xml ├── serialmonitor_settings.xml ├── vcs.xml ├── scala_compiler.xml ├── compiler.xml ├── misc.xml ├── wenyan-jvm.iml └── uiDesigner.xml ├── project_example ├── src │ └── main │ │ └── java │ │ ├── main │ │ ├── hello │ │ │ └── 其他文件.wy │ │ └── 主文件.wy │ │ └── 藏書樓 │ │ └── 子曰 │ │ ├── 君子 │ │ └── 序.wy │ │ └── 序.wy ├── MakeFile.txt ├── project_example.iml └── pom.xml ├── images ├── logo.png ├── color.png ├── turing.png └── program.png ├── 关于文言文编程语言Java编译器.pdf ├── wenyan_lang_jvm.iml ├── src ├── main │ └── java │ │ └── cn │ │ └── wenyan │ │ ├── compiler │ │ ├── Init.java │ │ ├── RunCode.java │ │ ├── utils │ │ │ ├── PrettyCode.groovy │ │ │ ├── ScalaUtils.scala │ │ │ ├── ResultEntry.java │ │ │ ├── SyntaxColor.java │ │ │ ├── FileFormat.java │ │ │ ├── SpecialSyntaxLexer.scala │ │ │ ├── Assert.java │ │ │ ├── GroovyPrettyCode.groovy │ │ │ ├── VarLabel.java │ │ │ ├── NumberTree.groovy │ │ │ ├── GroovyUtils.groovy │ │ │ ├── Utils.java │ │ │ └── LexerUtils.scala │ │ ├── log │ │ │ ├── PluginLogger.java │ │ │ ├── Message.java │ │ │ ├── ILogger.java │ │ │ ├── LogLevel.java │ │ │ ├── LogFormat.java │ │ │ ├── ServerLogger.java │ │ │ └── LoggerUtil.java │ │ ├── exceptions │ │ │ ├── SyntaxException.java │ │ │ └── CommandException.java │ │ ├── Compile.java │ │ ├── lib │ │ │ ├── Defines.java │ │ │ ├── Define.java │ │ │ ├── WenYanException.java │ │ │ ├── MathUtil.groovy │ │ │ ├── ArrayUtils.groovy │ │ │ └── JSArray.groovy │ │ ├── LanguageCompiler.java │ │ ├── plugins │ │ │ ├── Main.java │ │ │ ├── Listener.java │ │ │ ├── JavaPluginClassloader.java │ │ │ ├── Plugin.scala │ │ │ ├── PluginManager.java │ │ │ └── PHPPlugin.groovy │ │ ├── WenYanCompiler.java │ │ ├── command │ │ │ ├── GroovyCommand.java │ │ │ ├── StrongTypeCommand.java │ │ │ ├── LexerViewerCommand.java │ │ │ ├── OutFileCommand.java │ │ │ ├── PinYinCommand.java │ │ │ ├── SourceCommand.java │ │ │ ├── WenYuanGeDownloadCommand.java │ │ │ ├── ClassFileCommand.java │ │ │ ├── MainClassCommand.java │ │ │ ├── CompileLibCommand.java │ │ │ ├── RunCommand.java │ │ │ ├── WenYuanGeCommand.java │ │ │ ├── Command.java │ │ │ ├── CompileFileCommand.java │ │ │ ├── CommandHandler.java │ │ │ └── CompilerConfig.java │ │ ├── WenYanTools.groovy │ │ ├── factory │ │ │ ├── StreamBuilder.java │ │ │ └── CompileFactory.java │ │ ├── test │ │ │ ├── TestMain.java │ │ │ └── PackStdLib.java │ │ ├── CompileBackend.java │ │ ├── streams │ │ │ ├── CompileStream.java │ │ │ ├── CommentCompileStream.java │ │ │ ├── ObjectCompileStream.java │ │ │ ├── ArrayCompileStream.java │ │ │ ├── MathCompileStream.java │ │ │ ├── TryCompileStream.java │ │ │ └── ControlCompileStream.java │ │ ├── WenYanRuntime.java │ │ ├── CompileResult.java │ │ ├── GroovyCompiler.java │ │ ├── script │ │ │ └── libs │ │ │ │ ├── Library.groovy │ │ │ │ ├── Syntax.java │ │ │ │ ├── Language.groovy │ │ │ │ └── LanguageUtils.groovy │ │ ├── Main.java │ │ ├── WenYanShell.java │ │ ├── WenyanToGroovyBackend.java │ │ └── PrepareCompiler.java │ │ └── lang │ │ ├── 西曆法.wy │ │ ├── 畫譜.wy │ │ ├── 籌經.wy │ │ ├── 物經.wy │ │ ├── 易經.wy │ │ ├── 位經.wy │ │ ├── 格物.wy │ │ ├── 列經.wy │ │ ├── 曆表.wy │ │ └── 渾沌經.wy └── test │ └── lang │ └── wenyan │ └── test │ └── TestImport.java ├── web └── hello.html ├── .github └── ISSUE_TEMPLATE │ ├── custom.md │ ├── feature_request.md │ └── bug_report.md ├── CONTRIBUTING.md ├── LICENSE ├── book └── var.md ├── document └── Java-Compiler.md ├── CODE_OF_CONDUCT.md └── pom.xml /start/test.groovy: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | wenyan_lang -------------------------------------------------------------------------------- /project_example/src/main/java/main/hello/其他文件.wy: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /project_example/src/main/java/藏書樓/子曰/君子/序.wy: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /project_example/src/main/java/main/主文件.wy: -------------------------------------------------------------------------------- 1 | 吾嘗觀「「子曰」」之書。方悟「子曰」之義。 2 | 3 | 子曰『君曰甚好』 -------------------------------------------------------------------------------- /images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wenyan-lang/wenyan-jvm/HEAD/images/logo.png -------------------------------------------------------------------------------- /images/color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wenyan-lang/wenyan-jvm/HEAD/images/color.png -------------------------------------------------------------------------------- /images/turing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wenyan-lang/wenyan-jvm/HEAD/images/turing.png -------------------------------------------------------------------------------- /images/program.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wenyan-lang/wenyan-jvm/HEAD/images/program.png -------------------------------------------------------------------------------- /关于文言文编程语言Java编译器.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wenyan-lang/wenyan-jvm/HEAD/关于文言文编程语言Java编译器.pdf -------------------------------------------------------------------------------- /wenyan_lang_jvm.iml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.idea/wenyan-lang_jvm.iml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /project_example/MakeFile.txt: -------------------------------------------------------------------------------- 1 | /Users/luchangcun/Projects/new/wenyan-jvm/project_example/src/main/java/main/主文件.wy -------------------------------------------------------------------------------- /project_example/project_example.iml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /start/compiler.groovy: -------------------------------------------------------------------------------- 1 | import cn.wenyan.compiler.WenYanTools 2 | 3 | 4 | print WenYanTools.default.dispatch("乃得一") 5 | -------------------------------------------------------------------------------- /.idea/dictionaries/luchangcun.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/Init.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler; 2 | 3 | public interface Init { 4 | 5 | void init(WenYanCompilerImpl impl); 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/RunCode.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler; 2 | 3 | public interface RunCode { 4 | 5 | Object run(boolean out,String... wenyanString); 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/utils/PrettyCode.groovy: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.utils 2 | 3 | trait PrettyCode { 4 | 5 | abstract String pretty(String string) 6 | 7 | } 8 | -------------------------------------------------------------------------------- /.idea/serialmonitor_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/hello.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 | HelloWorld 9 | 10 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/custom.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Custom issue template 3 | about: Describe this issue template's purpose here. 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/scala_compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/log/PluginLogger.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.log; 2 | 3 | import java.io.File; 4 | 5 | public class PluginLogger extends ServerLogger { 6 | 7 | public PluginLogger(File parentDir, String prefix) { 8 | super(parentDir, prefix); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/exceptions/SyntaxException.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.exceptions; 2 | 3 | public class SyntaxException extends RuntimeException { 4 | 5 | public SyntaxException() { 6 | } 7 | 8 | public SyntaxException(String message) { 9 | super(message); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/Compile.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler; 2 | 3 | /** 4 | * 此为编译器之行动者乎,以规编译器之正式编译语 5 | * 6 | * @author 卢昶存 7 | */ 8 | 9 | public interface Compile { 10 | 11 | /** 12 | * 若以此,需行标准之指令选项哉。 13 | * @param args 选项之令 14 | * @return 变数之阴阳 15 | */ 16 | int compile(String... args); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/lang/西曆法.wy: -------------------------------------------------------------------------------- 1 | 疏曰『 2 | 3 | 此經乃改編者以順java之道 4 | 5 | 參見 https://github.com/wenyan-lang/wenyan/tree/master/lib 6 | 7 | 8 | 』 9 | 10 | 今有一術。名之曰「紀元時」。是術曰。 11 | 施「{-> new Date().getTime()/1000}」。乃得矣。 12 | 是謂「紀元時」之術也。 13 | 14 | 今有一術。名之曰「時差」。欲行是術。必先得一數。曰「時」。乃行是術曰。 15 | 施「{x -> 0 - new Date(x * 1000).getTimezoneOffset() * 60}」於「時」。乃得矣。 16 | 是謂「時差」之術也。 -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/lib/Defines.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.lib; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target(ElementType.TYPE) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface Defines { 11 | 12 | Define[] value(); 13 | } 14 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## CONTRIBUTING NOTICE 2 | 3 | Wenyan and java enthusiasts are welcome to submit your code. If you are familiar with js, please turn to the wenyan project. 4 | 5 | If you need to provide your code, please ensure that the tests of the code are successful, and that the code is harmless and relevant to the meaning of the project. 6 | 7 | Please elaborate on its function or repair, so that we can refer to it. 8 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/LanguageCompiler.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler; 2 | 3 | 4 | /** 5 | * 万事成功皆包容,狭隘皆使万事崩。 6 | * 忆昔太宗盛名日,悲叹百年屈辱中。 7 | * 8 | * 故建此类包万物,万语皆可编译通。 9 | * 君仅继承此类者,并用语言类去行。 10 | * 11 | * 亦吾一词在心中,此器不只爪哇乎。 12 | */ 13 | public interface LanguageCompiler { 14 | 15 | Class compile(String script); 16 | 17 | Class compile(String script, String className); 18 | 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/test/lang/wenyan/test/TestImport.java: -------------------------------------------------------------------------------- 1 | package lang.wenyan.test; 2 | 3 | import cn.wenyan.compiler.WenYanCompiler; 4 | import cn.wenyan.compiler.WenYanTools; 5 | import cn.wenyan.compiler.script.libs.Language; 6 | import org.junit.Test; 7 | 8 | public class TestImport { 9 | 10 | @Test 11 | public void test(){ 12 | WenYanCompiler wenYanCompiler = WenYanTools.makeCompiler(Language.GROOVY); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/lang/畫譜.wy: -------------------------------------------------------------------------------- 1 | 2 | 3 | 吾有一列。名之曰「色表」。充「色表」 4 | 以「「黑」」。 以「「#000000」」。 5 | 以「「鈦白」」。 以「「#ffffff」」。 6 | 以「「藤黃」」。 以「「#faea56」」。 7 | 以「「硃磦」」。 以「「#d44906」」。 8 | 以「「硃砂」」。 以「「#c0927b」」。 9 | 以「「胭脂」」。 以「「#491817」」。 10 | 以「「曙紅」」。 以「「#c72c35」」。 11 | 以「「赭石」」。 以「「#522d14」」。 12 | 以「「大紅」」。 以「「#b91c1b」」。 13 | 以「「花青」」。 以「「#141931」」。 14 | 以「「三綠」」。 以「「#afceb5」」。 15 | 以「「酞青藍」」。 以「「#1e2867」」。 16 | 以「「三青」」。 以「「#acc8d4」」。 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/lib/Define.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.lib; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target(ElementType.TYPE) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface Define { 11 | 12 | String before(); 13 | 14 | String after(); 15 | 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/lib/WenYanException.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.lib; 2 | 3 | public class WenYanException extends Exception { 4 | 5 | private String name; 6 | 7 | public String getName() { 8 | return name; 9 | } 10 | 11 | public void setName(String name) { 12 | this.name = name; 13 | } 14 | 15 | @Override 16 | public String toString() { 17 | return name; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/plugins/Main.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.plugins; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target(ElementType.TYPE) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface Main { 11 | 12 | String name(); 13 | 14 | Class after(); 15 | 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/WenYanCompiler.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler; 2 | 3 | 4 | public interface WenYanCompiler extends Compile{ 5 | 6 | String ERROR = "error"; 7 | 8 | String WYG = "藏書樓"; 9 | 10 | String WYG_LIB = "序.wy"; 11 | 12 | Class compileToClass(String className,String... wenyanString); 13 | 14 | Class compileToClass(String... wenyans); 15 | 16 | String dispatch(String wenyan); 17 | 18 | WenYanRuntime getRuntime(); 19 | } 20 | -------------------------------------------------------------------------------- /project_example/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | cn.noyark 8 | project_example 9 | 1.0-SNAPSHOT 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/lib/MathUtil.groovy: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.lib 2 | 3 | import groovy.transform.CompileStatic 4 | 5 | @CompileStatic 6 | class MathUtil { 7 | 8 | static Number mod(BigDecimal decimal1,BigDecimal decimal2){ 9 | if(decimal1.toString().contains(".")||decimal2.toString().contains(".")){ 10 | return decimal1 11 | }else{ 12 | return decimal1.toBigInteger()%(decimal2.toBigInteger()) 13 | } 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/plugins/Listener.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.plugins; 2 | 3 | import cn.wenyan.compiler.streams.CompileStream; 4 | 5 | import java.util.List; 6 | 7 | public abstract class Listener { 8 | 9 | public abstract void onCompileStart(CompileStream stream,List list); 10 | 11 | public abstract void onCompileFinish(CompileStream stream, List list); 12 | 13 | public abstract void onCompileFailed(CompileStream stream,List list); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/log/Message.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.log; 2 | 3 | public class Message{ 4 | String message; 5 | Throwable throwable; 6 | 7 | public Message(String message, Throwable throwable) { 8 | this.message = message; 9 | this.throwable = throwable; 10 | } 11 | 12 | public String getMessage() { 13 | return message; 14 | } 15 | 16 | public Throwable getThrowable() { 17 | return throwable; 18 | } 19 | 20 | 21 | 22 | } -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/command/GroovyCommand.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.command; 2 | 3 | 4 | public class GroovyCommand extends Command { 5 | 6 | public GroovyCommand() { 7 | super("-g",0); 8 | } 9 | 10 | @Override 11 | public Object execute(String[] args, CompilerConfig compilerConfig) { 12 | compilerConfig.setGroovy(false); 13 | return null; 14 | } 15 | 16 | @Override 17 | public String help() { 18 | return "選擇生成groovy文件"; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/command/StrongTypeCommand.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.command; 2 | 3 | public class StrongTypeCommand extends Command { 4 | 5 | public StrongTypeCommand() { 6 | super("-st",0); 7 | } 8 | 9 | @Override 10 | public Object execute(String[] args, CompilerConfig compilerConfig) { 11 | compilerConfig.setStrongType(true); 12 | return null; 13 | } 14 | 15 | @Override 16 | public String help() { 17 | return "开启强类型编译模式"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/command/LexerViewerCommand.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.command; 2 | 3 | public class LexerViewerCommand extends Command{ 4 | 5 | 6 | public LexerViewerCommand(){ 7 | super("-lv",0); 8 | } 9 | 10 | @Override 11 | public Object execute(String[] args, CompilerConfig compilerConfig) { 12 | compilerConfig.setLexerViewer(true); 13 | return null; 14 | } 15 | 16 | @Override 17 | public String help() { 18 | return "可視化分詞信息"; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/command/OutFileCommand.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.command; 2 | 3 | public class OutFileCommand extends Command { 4 | 5 | public OutFileCommand() { 6 | super("-o",1); 7 | } 8 | 9 | @Override 10 | public Object execute(String[] args, CompilerConfig compilerConfig) { 11 | compilerConfig.setOutFile(args[0]); 12 | return null; 13 | } 14 | 15 | @Override 16 | public String help() { 17 | return "参数: OutFile,单独设置编译文件输出的文件夹"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/command/PinYinCommand.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.command; 2 | 3 | public class PinYinCommand extends Command { 4 | 5 | public PinYinCommand() { 6 | super("-p",1); 7 | } 8 | 9 | @Override 10 | public Object execute(String[] args, CompilerConfig compilerConfig) { 11 | compilerConfig.setSupportPinYin(Boolean.parseBoolean(args[0])); 12 | return null; 13 | } 14 | 15 | @Override 16 | public String help() { 17 | return "该指令已经废弃,使用无效"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/lang/籌經.wy: -------------------------------------------------------------------------------- 1 | 注曰「「求和。同Javascript之reduce((a,b)=>a+b)也。」」 2 | 今有一術。名之曰「求和」。欲行是術。必先得一列。曰「列」。乃行是術曰。 3 | 吾有一數。曰零。名之曰「和」。凡「列」中之「數」。加「和」以「數」。昔之「和」者,今其是也。 4 | 乃得「和」。是謂「求和」之術也。 5 | 6 | 今有一術。名之曰「算術平均」。欲行是術。必先得一列。曰「列」。乃行是術曰。 7 | 施「求和」於「列」。名之曰「和」。夫「列」之長。名之曰「長」。除「和」以「長」。 8 | 名之曰「算術平均數」。乃得「算術平均數」。是謂「算術平均」之術也。 9 | 10 | 今有一術。名之曰「方差」。欲行是術。必先得一列。曰「列」。乃行是術曰。 11 | 施「算術平均」於「列」。名之曰「算術平均數」。夫「列」之長。名之曰「長」。 12 | 吾有一數。曰零。名之曰「平方和」。凡「列」中之「數」。減「數」以「算術平均數」。 13 | 名之曰「偏差」。乘「偏差」以「偏差」。名之曰「偏差之平方」。 14 | 加「偏差之平方」以「平方和」。昔之「平方和」者,今其是也。除「平方和」以「長」。 15 | 名之曰「方差之數」。乃得「方差之數」。是謂「方差」之術也。 -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/command/SourceCommand.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.command; 2 | 3 | public class SourceCommand extends Command{ 4 | 5 | 6 | public SourceCommand() { 7 | super("-sc",1); 8 | } 9 | 10 | @Override 11 | public Object execute(String[] args, CompilerConfig compilerConfig) { 12 | compilerConfig.setSourcePath(args[0]); 13 | return null; 14 | } 15 | 16 | @Override 17 | public String help() { 18 | return "参数: sourcePath,指定源文件的根目录,根目录下面的文件夹则作为package名称"; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/command/WenYuanGeDownloadCommand.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.command; 2 | 3 | public class WenYuanGeDownloadCommand extends Command { 4 | 5 | public WenYuanGeDownloadCommand() { 6 | super("-wd",1); 7 | } 8 | 9 | @Override 10 | public Object execute(String[] args, CompilerConfig compilerConfig) { 11 | compilerConfig.setWygDownload(args[0]); 12 | return null; 13 | } 14 | 15 | @Override 16 | public String help() { 17 | return "参数: name,相当于wyg i name,确保有node.js"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/utils/ScalaUtils.scala: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.utils 2 | 3 | import cn.wenyan.compiler.WenYanLib 4 | 5 | 6 | object ScalaUtils { 7 | 8 | def containsCommonNumber(wenyan:String) : Boolean ={ 9 | val numbers = WenYanLib.prefixs 10 | for((x,y)<-numbers){ 11 | if(wenyan.contains(x))return true 12 | } 13 | false 14 | } 15 | 16 | def countTime(func : =>Unit): Long ={ 17 | val start = System.currentTimeMillis 18 | func 19 | val end = System.currentTimeMillis 20 | return end -start 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/lang/物經.wy: -------------------------------------------------------------------------------- 1 | 疏曰『 2 | 3 | 此經乃改編者以順java之道 4 | 5 | 參見 https://github.com/wenyan-lang/wenyan/tree/master/lib 6 | 7 | 8 | 』 9 | 或云「「觀物「甲」為非數」」。 10 | 蓋謂「「施「{x -> x.class == Integer.class||x.class == BigInteger.class||x.class == java.math.BigDecimal}」於「甲」。」」 11 | 12 | 或云「「觀物「甲」為非列」」。 13 | 蓋謂「「施「{x -> x.class == JSArray.class}」於「甲」。」」 14 | 15 | 或云「「觀物「甲」為非言」」。 16 | 蓋謂「「施「{x -> x.class == String.class}」於「甲」。」」 17 | 18 | 或云「「觀物「甲」為非物」」。 19 | 蓋謂「「施「{x -> x.class == Map.class}」於「甲」。」」 20 | 21 | 或云「「觀物「甲」為非爻」」。 22 | 蓋謂「「施「{x -> x.class == Boolean.class}」於「甲」。」」 23 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/command/ClassFileCommand.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.command; 2 | 3 | public class ClassFileCommand extends Command { 4 | 5 | public ClassFileCommand() { 6 | super("-n",1); 7 | } 8 | 9 | @Override 10 | public Object execute(String[] args, CompilerConfig compilerConfig) { 11 | compilerConfig.setClassFile(args[0]); 12 | return null; 13 | } 14 | 15 | @Override 16 | public String help() { 17 | return "参数: 主类,运行时,设置运行主类,比如cn.main.HelloWorld,对应着@sourceFile/cn/main/HelloWorld.wy"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/command/MainClassCommand.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.command; 2 | 3 | public class MainClassCommand extends Command { 4 | 5 | public MainClassCommand() { 6 | super("-m", 1); 7 | } 8 | 9 | @Override 10 | public Object execute(String[] args, CompilerConfig compilerConfig) { 11 | compilerConfig.setMainClass(args[0]); 12 | return null; 13 | } 14 | 15 | @Override 16 | public String help() { 17 | return "参数: 主类,编译时,设置编译主类,比如cn.main.HelloWorld,对应着@sourceFile/cn/main/HelloWorld.wy"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/command/CompileLibCommand.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.command; 2 | 3 | public class CompileLibCommand extends Command { 4 | 5 | public CompileLibCommand() { 6 | super("-l",1); 7 | } 8 | 9 | @Override 10 | public Object execute(String[] args, CompilerConfig compilerConfig) { 11 | String[] libs = args[0].split(";"); 12 | compilerConfig.setCompileLib(libs); 13 | return null; 14 | } 15 | 16 | @Override 17 | public String help() { 18 | return "参数: jarFiles,加入依赖的jar包,如hello.jar;eat.jar"; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/command/RunCommand.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.command; 2 | 3 | public class RunCommand extends Command { 4 | 5 | public RunCommand() { 6 | super("-r",-1); 7 | } 8 | 9 | @Override 10 | public Object execute(String[] args, CompilerConfig compilerConfig) { 11 | compilerConfig.setRun(true); 12 | compilerConfig.setRunArgs(args); 13 | return null; 14 | } 15 | 16 | @Override 17 | public String help() { 18 | return "参数: 程序参数,运行主文件,-r后面跟着args,即程序参数,这个选项必须放在最后面,比如 -o xxx -c xxx -r 1 2 3"; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/lang/易經.wy: -------------------------------------------------------------------------------- 1 | 疏曰『 2 | 3 | 此經乃改編者以順java之道 4 | 5 | 參見 https://github.com/wenyan-lang/wenyan/tree/master/lib 6 | 7 | 8 | 』 9 | 吾有一數。曰四十二。名之曰「運數」。 10 | 11 | 今有一術。名之曰「運」。欲行是術。必先得一數。曰「甲」。乃行是術曰。 12 | 注曰「「運者。隨機種子也」」 13 | 昔之「運數」者。今「甲」是矣。 14 | 是謂「運」之術也。 15 | 16 | 今有一術。名之曰「占」。是術曰。 17 | 注曰「「線性同餘方法所得隨機數也」」 18 | 有數四十二億九千四百九十六萬七千二百九十六。名之曰「模」。 19 | 注曰「「有數二千二百六十九萬五千四百七十七。名之曰「倍」。」」 20 | 有數二千二百六十七萬五千四百五十六。名之曰「上倍」。有數二萬零二十一。名之曰「下倍」。 21 | 有數一。名之曰「增」。 22 | 乘「上倍」於「運數」。除其以「模」。所餘幾何。名之曰「上餘」。 23 | 乘「下倍」於「運數」。加其於「上餘」。加其以「增」。除其以「模」。所餘幾何。昔之「運數」者。今其是矣。 24 | 除「運數」以「模」。名之曰「卦」。 25 | 乃得「卦」。 26 | 是謂「占」之術也。 -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/command/WenYuanGeCommand.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.command; 2 | 3 | import cn.wenyan.compiler.WenYanCompiler; 4 | 5 | public class WenYuanGeCommand extends Command{ 6 | 7 | public WenYuanGeCommand() { 8 | super("-wyg",1); 9 | } 10 | 11 | @Override 12 | public Object execute(String[] args, CompilerConfig compilerConfig) { 13 | compilerConfig.setWenyuangeFile(args[0]); 14 | return null; 15 | } 16 | 17 | @Override 18 | public String help() { 19 | return "参数: "+WenYanCompiler.WYG+"的上一级目录,将文渊阁编译进去,后面跟着"+ WenYanCompiler.WYG+"的上一级目录即可,需要有-sc和-o的内容"; 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/command/Command.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.command; 2 | 3 | public abstract class Command { 4 | 5 | private String option; 6 | 7 | private int argsLength; 8 | 9 | public abstract Object execute(String[] args,CompilerConfig compilerConfig); 10 | 11 | public Command(String option, int argsLength) { 12 | this.option = option; 13 | this.argsLength = argsLength; 14 | } 15 | 16 | 17 | public int getArgsLength() { 18 | return argsLength; 19 | } 20 | 21 | public String getOption() { 22 | return option; 23 | } 24 | 25 | public abstract String help(); 26 | } 27 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/exceptions/CommandException.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.exceptions; 2 | 3 | public class CommandException extends RuntimeException { 4 | 5 | public CommandException() { 6 | } 7 | 8 | public CommandException(String message) { 9 | super(message); 10 | } 11 | 12 | public CommandException(String message, Throwable cause) { 13 | super(message, cause); 14 | } 15 | 16 | public CommandException(Throwable cause) { 17 | super(cause); 18 | } 19 | 20 | public CommandException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { 21 | super(message, cause, enableSuppression, writableStackTrace); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/utils/ResultEntry.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.utils; 2 | 3 | import java.util.List; 4 | 5 | public class ResultEntry { 6 | 7 | private List code; 8 | 9 | private String outCode; 10 | 11 | public ResultEntry(List code, String outCode) { 12 | this.code = code; 13 | this.outCode = outCode; 14 | } 15 | 16 | public List getCode() { 17 | return code; 18 | } 19 | 20 | public void setCode(List code) { 21 | this.code = code; 22 | } 23 | 24 | public String getOutCode() { 25 | return outCode; 26 | } 27 | 28 | public void setOutCode(String outCode) { 29 | this.outCode = outCode; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/utils/SyntaxColor.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.utils; 2 | 3 | import cn.wenyan.compiler.WenYanCompilerImpl; 4 | 5 | public class SyntaxColor { 6 | 7 | 8 | public static String[] command = new String[]{ 9 | "吾","有","曰","名","書","數","言","爻","列","物", 10 | "昔","者","今","是","疏","注","批","為", 11 | "遍","云","也","若","者","止","恆","若非", 12 | "加","減","乘","除","以","於","矣","所餘幾何","夫", 13 | "有","陽","無","陰","乎","中","凡","中","術","術", 14 | "得","謂","術","欲行是術","必先","行","施", 15 | "於","嘗觀","書","方悟","義","是","乃","之","欲" 16 | }; 17 | public static String getSyntaxColor(String wenyan, WenYanCompilerImpl compiler){ 18 | return wenyan; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/WenYanTools.groovy: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler 2 | 3 | import cn.wenyan.compiler.script.libs.Language 4 | import groovy.transform.CompileStatic 5 | import groovy.transform.TypeCheckingMode 6 | 7 | @CompileStatic 8 | class WenYanTools { 9 | 10 | static { 11 | setDefault() 12 | } 13 | 14 | @CompileStatic(TypeCheckingMode.SKIP) 15 | private static void setDefault(){ 16 | WenYanTools.metaClass.static.default = { 17 | getDefault() 18 | } 19 | } 20 | 21 | static WenYanCompiler makeCompiler(Language language){ 22 | return new WenYanCompilerImpl(false,language) 23 | } 24 | 25 | static WenYanCompiler getDefault(){ 26 | return makeCompiler(Language.GROOVY) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/utils/FileFormat.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.utils; 2 | 3 | import org.apache.commons.io.FileUtils; 4 | 5 | import java.io.File; 6 | import java.io.IOException; 7 | import java.util.List; 8 | 9 | public class FileFormat { 10 | 11 | public List formatEnd(File file){ 12 | try { 13 | List strings = FileUtils.readLines(file, System.getProperty("file.coding")); 14 | for(int i = 0;i streams = new ArrayList<>(); 14 | 15 | private WenYanCompilerImpl compiler; 16 | 17 | public StreamBuilder(WenYanCompilerImpl compiler){ 18 | this.compiler = compiler; 19 | } 20 | 21 | public StreamBuilder put(CompileStream stream){ 22 | streams.add(stream); 23 | return this; 24 | } 25 | 26 | public CompileFactory build(){ 27 | return new CompileFactory(streams,compiler); 28 | } 29 | 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/utils/SpecialSyntaxLexer.scala: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.utils 2 | 3 | import cn.wenyan.compiler.WenYanLib 4 | 5 | object SpecialSyntaxLexer { 6 | 7 | 8 | def matches(p : (String,String),index : Int,strings: String,patterns : scala.collection.mutable.Map[String,String]) : Boolean={ 9 | if(p._2.equals(patterns(WenYanLib.STATEMENT))){ 10 | if(index+1<=strings.length-1&&strings(index+1) == '之')return false 11 | } 12 | if(p._2.equals(patterns(WenYanLib.GET))){ 13 | if(index+1<=strings.length-1&&strings(index+1) == '餘')return false 14 | } 15 | if(p._2.equals(patterns(WenYanLib.AND_OR))){ 16 | if(index+1<=strings.length-1&&strings(index+1) == '「')return false 17 | } 18 | true 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/utils/Assert.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.utils; 2 | 3 | import cn.wenyan.compiler.WenYanCompilerImpl; 4 | import cn.wenyan.compiler.exceptions.SyntaxException; 5 | 6 | import java.util.List; 7 | 8 | public class Assert { 9 | 10 | public static void typeCheck(WenYanCompilerImpl stream, String name, String code, String... types){ 11 | String type = stream.getNameType().get(name); 12 | for(String s: types){ 13 | if(type.equals(s)){ 14 | throw new SyntaxException("昔"+name+"为"+type+"者,不能迭代之: "+code); 15 | } 16 | } 17 | } 18 | 19 | public static List syntaxError(String wenyan) throws SyntaxException{ 20 | String prefix = "\n于此言有误: "; 21 | throw new SyntaxException(prefix+ wenyan+"\n"); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/plugins/JavaPluginClassloader.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.plugins; 2 | 3 | import java.io.File; 4 | import java.net.MalformedURLException; 5 | import java.net.URL; 6 | import java.net.URLClassLoader; 7 | 8 | public class JavaPluginClassloader extends URLClassLoader { 9 | 10 | public JavaPluginClassloader(File file) throws MalformedURLException { 11 | super(new URL[]{file.toURI().toURL()}, JavaPluginClassloader.class.getClassLoader()); 12 | } 13 | 14 | @Override 15 | protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { 16 | if(name.startsWith("cn.wenyan")){ 17 | throw new ClassNotFoundException("you couldn't use cn.wenyan package name"); 18 | } 19 | return super.loadClass(name, resolve); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/test/TestMain.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.test; 2 | 3 | import cn.wenyan.compiler.WenYanCompiler; 4 | import cn.wenyan.compiler.WenYanTools; 5 | import cn.wenyan.compiler.script.libs.Language; 6 | 7 | public class TestMain { 8 | // 9 | public static void main(String[] args) { 10 | String project = "/Users/luchangcun/Projects/new/wenyan-jvm/project_example"; 11 | String makeFile = project+"/MakeFile.txt"; 12 | String sc = project+"/src/main/java"; 13 | String out = project+"/target"; 14 | WenYanCompiler impl = WenYanTools.makeCompiler(Language.GROOVY); 15 | impl.compile("-c","@"+makeFile,out,"-sc",sc,"-m","main.主文件","-g","-wyg",sc); 16 | impl.compile("-o","/Users/luchangcun/Projects/new/wenyan-jvm/project_example/target/","-n","main.主文件","-r"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/CompileBackend.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler; 2 | 3 | 4 | import java.io.File; 5 | import java.io.FileNotFoundException; 6 | import java.util.List; 7 | 8 | public interface CompileBackend extends Init{ 9 | 10 | void appendClassName(int index, String mainClass, String className, List codes, StringBuilder builder, String annotation, String pack); 11 | 12 | default String filterAndToString(List results,String filter){ 13 | StringBuilder builder = new StringBuilder(); 14 | for(String r :results) { 15 | if(r!=null&&filter!=null&&r.startsWith(filter))continue; 16 | builder.append("\n").append(r); 17 | } 18 | return builder.toString(); 19 | } 20 | 21 | 22 | 23 | void compileToClass(File out, File classFile) throws FileNotFoundException; 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/plugins/Plugin.scala: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.plugins 2 | 3 | import java.util.regex.Pattern 4 | 5 | import cn.wenyan.compiler.streams.CompileStream 6 | 7 | import scala.collection.mutable 8 | import java.util 9 | 10 | import cn.wenyan.compiler.Init 11 | 12 | abstract class Plugin extends Init{ 13 | 14 | def addSyntaxRegex(map : mutable.Map[String,String]) 15 | 16 | def addPatterns(map : mutable.Map[String,Pattern]) 17 | 18 | def addCompileStream(map : util.List[CompileStream]) 19 | 20 | def addListener(map : util.List[Listener]) 21 | 22 | //如果你需要拦截高优先级的语法,则可以在这里拦截,可以参见 23 | //LexerUtils的canMatch中的三个if判断 24 | //如语法有夫「x」之长和夫「x」,为了防止分割夫「x」之长,可以在匹配夫「x」时 25 | //后面有没有之,来组合上面的语法 26 | def onCanMatch(p : (String,String),index : Int,strings: String,patterns : util.Map[String,String]) : Boolean 27 | 28 | } 29 | -------------------------------------------------------------------------------- /start/wenyan.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ####### 4 | #1. wenyan.sh compile @MakeFile.wy targetPath sourcePath mainClass 5 | #2. wenyan.sh wyg targetPath sourcePath 6 | #3. wenyan,sh run targetPath mainClass args 7 | #4. wenyan.sh help 8 | #5. wenyan.sh common args 9 | ####### 10 | 11 | compile='compile' 12 | wyg='wyg' 13 | run='run' 14 | help='help' 15 | common='common' 16 | c="java -jar wenyan.jar" 17 | if [ "$1" == $compile ]; then 18 | 19 | "$c" -c $2 $3 -sc $4 -m $5 20 | 21 | elif [ "$1" == $wyg ]; then 22 | 23 | "$c" -o $1 -sc $2 -wyg $2 24 | 25 | elif [ "$1" == $run ]; then 26 | ar="$4" 27 | for (( i = 5; i <= $#; ++i )); do 28 | ar+=" ${!i}" 29 | done 30 | "$c" -o $2 -n $3 -r "$ar" 31 | elif [ "$1" == $help ]; then 32 | java -jar wenyan.jar 33 | elif [ "$1" == $common ]; then 34 | ar="" 35 | for (( i = 0; i <= $#; ++i )); do 36 | ar+=" ${!i}" 37 | done 38 | "$c" "$ar" 39 | fi -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/streams/CompileStream.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.streams; 2 | 3 | import cn.wenyan.compiler.CompileResult; 4 | import cn.wenyan.compiler.WenYanCompilerImpl; 5 | import cn.wenyan.compiler.script.libs.Language; 6 | import cn.wenyan.compiler.script.libs.Library; 7 | 8 | import java.util.List; 9 | 10 | public abstract class CompileStream { 11 | 12 | protected WenYanCompilerImpl compiler; 13 | 14 | protected Language language; 15 | 16 | protected Library library; 17 | 18 | CompileStream(WenYanCompilerImpl compiler){ 19 | this.compiler = compiler; 20 | this.language = compiler.getLanguageType(); 21 | this.compiler.getStreamMap().put(this.getClass(),this); 22 | this.library = compiler.getLibrary(); 23 | } 24 | public abstract CompileResult compile(List wenyan); 25 | 26 | public Language getLanguage() { 27 | return language; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/WenYanRuntime.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | 6 | public class WenYanRuntime { 7 | 8 | private WenYanCompilerImpl compiler; 9 | 10 | private WenYanShell shell; 11 | 12 | public WenYanRuntime(WenYanCompilerImpl compiler){ 13 | this(compiler,new WenYanShell(compiler)); 14 | } 15 | 16 | public WenYanRuntime(WenYanCompilerImpl compiler,WenYanShell shell){ 17 | this.compiler = compiler; 18 | this.shell = shell; 19 | } 20 | 21 | public void runFile(String file){ 22 | try { 23 | runFile(new File(file)); 24 | }catch (IOException e){ 25 | compiler.getServerLogger().info("",e); 26 | } 27 | } 28 | 29 | 30 | public WenYanShell getShell() { 31 | return shell; 32 | } 33 | 34 | public void runFile(File file) throws IOException { 35 | shell.run(false,compiler.getWenYanCodeByFile(file)); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/test/PackStdLib.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.test; 2 | 3 | import cn.wenyan.compiler.WenYanCompilerImpl; 4 | import cn.wenyan.compiler.WenYanTools; 5 | import cn.wenyan.compiler.script.libs.Language; 6 | 7 | import java.io.File; 8 | 9 | public class PackStdLib { 10 | //施「JSON.stringify」於「太白餛飩」。書之。 11 | //施「包渾沌」於「太白餛飩」。書之。 12 | public static void main(String[] args) { 13 | String project = "/Users/luchangcun/Projects/new/wenyan-jvm/"; 14 | WenYanCompilerImpl wenYanCompiler = (WenYanCompilerImpl) WenYanTools.makeCompiler(Language.GROOVY); 15 | String source = project+"src/main/java/"; 16 | wenYanCompiler.getLibrary().getLibs().forEach((x,y)-> { 17 | wenYanCompiler 18 | .compile( 19 | "-c", source + y.replace(".", File.separator) + ".wy", 20 | 21 | project + "/target/classes", 22 | 23 | "-sc", source,"-g" 24 | ); 25 | }); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/log/ILogger.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.log; 2 | 3 | 4 | /** 5 | * 接口 6 | */ 7 | public interface ILogger { 8 | 9 | void emergency(String message); 10 | 11 | void alert(String message); 12 | 13 | void critical(String message); 14 | 15 | void error(String message); 16 | 17 | void warning(String message); 18 | 19 | void notice(String message); 20 | 21 | void info(String message); 22 | 23 | void debug(String message); 24 | 25 | void log(LogLevel level, String message); 26 | 27 | void emergency(String message, Throwable t); 28 | 29 | void alert(String message, Throwable t); 30 | 31 | void critical(String message, Throwable t); 32 | 33 | void error(String message, Throwable t); 34 | 35 | void warning(String message, Throwable t); 36 | 37 | void notice(String message, Throwable t); 38 | 39 | void info(String message, Throwable t); 40 | 41 | void debug(String message, Throwable t); 42 | 43 | void log(LogLevel level, String message, Throwable t); 44 | } 45 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 MagicLu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/lang/位經.wy: -------------------------------------------------------------------------------- 1 | 疏曰『 2 | 3 | 此經乃改編者以順java之道 4 | 5 | 參見 https://github.com/wenyan-lang/wenyan/tree/master/lib 6 | 7 | 8 | 』 9 | 或云「「左移「甲」以「乙」」」。 10 | 蓋謂「「施「左移」於「甲」。於「乙」」」。 11 | 12 | 或云「「右移「甲」以「乙」」」。 13 | 蓋謂「「施「右移」於「甲」。於「乙」」」。 14 | 15 | 今有一術。名之曰「左移」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。 16 | 施「{x,y -> x< x>>y}」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。 21 | 是謂「右移」之術也。 22 | 23 | 今有一術。名之曰「補零右移」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。 24 | 施「{x,y-> (x % 0x100000000) >> y}」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。 25 | 是謂「補零右移」之術也。 26 | 27 | 今有一術。名之曰「位与」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。 28 | 施「{x,y-> x&y}」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。 29 | 是謂「位与」之術也。 30 | 31 | 今有一術。名之曰「位或」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。 32 | 施「{x,y -> x|y}」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。 33 | 是謂「位或」之術也。 34 | 35 | 今有一術。名之曰「异或」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。 36 | 施「{x,y -> x^y}」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。 37 | 是謂「异或」之術也。 38 | 39 | 今有一術。名之曰「与非」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。 40 | 施「{x,y-> ~(x&y)}」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。 41 | 是謂「与非」之術也。 42 | 43 | 今有一術。名之曰「位變」。欲行是術。必先得一數。曰「甲」。乃行是術曰。 44 | 施「{x-> ~x}」於「甲」。名之曰「乙」。乃得「乙」。 45 | 是謂「位變」之術也。 -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/log/LogLevel.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.log; 2 | 3 | 4 | import java.util.function.BiConsumer; 5 | 6 | 7 | public enum LogLevel { 8 | 9 | NONE((Message m, ILogger logger)->{}), 10 | EMERGENCY((Message m, ILogger logger)->logger.emergency(m.message,m.throwable)), 11 | ALERT((Message m, ILogger logger)->logger.alert(m.message,m.throwable)), 12 | CRITICAL((Message m, ILogger logger)->logger.critical(m.message,m.throwable)), 13 | ERROR((Message m, ILogger logger)->logger.critical(m.message,m.throwable)), 14 | WARNING((Message m, ILogger logger)->logger.warning(m.message,m.throwable)), 15 | NOTICE((Message m, ILogger logger)->logger.notice(m.message,m.throwable)), 16 | INFO((Message m, ILogger logger)->logger.info(m.message,m.throwable)), 17 | DEBUG((Message m, ILogger logger)->logger.debug(m.message,m.throwable)); 18 | 19 | private BiConsumer func; 20 | 21 | LogLevel(BiConsumer func) { 22 | this.func = func; 23 | } 24 | 25 | public BiConsumer getFunc() { 26 | return func; 27 | } 28 | 29 | 30 | 31 | } 32 | -------------------------------------------------------------------------------- /book/var.md: -------------------------------------------------------------------------------- 1 | # 关于文言文编程语言的变量 2 | 3 | > 类型 4 | 5 | |类型|解释|字面量例子| 6 | |---|---|---| 7 | |`數`|`number`类型,数字类型,可以是浮点型或者整型|`三千二百零一`,`二〇二〇`| 8 | |`言`|`string`类型,是字符串类型,可以是空字符串|`『予观夫巴陵胜状』`,`「「君子好逑」」` 9 | |`爻`|`boolean`类型,是布尔类型,只有两个值|`陰`,`陽`| 10 | |`列`|`array`类型,是数组类型|`...`| 11 | |`物`|`object`类型,定义对象|`...`| 12 | |`元`|`auto type`,可以反推类型|`...`| 13 | 14 | > 声明变量的表达式 15 | 16 | 通用表达式: 17 | 18 | 吾有\[N\]\[type\]。曰\[value1\]。曰\[value2\]...曰\[valueN\]。名之曰\[name1\]曰\[name2\]....\[nameN\] 19 | 20 | ###### 通用例子 21 | 22 | 1. 數 言 爻 23 | * 今/吾有一數/言/爻,曰三/「「问天地好在」」/陰,名之曰「甲」 24 | * 吾有三數。曰一。曰三。曰五。名之曰「甲」曰「乙」曰「丙」。 25 | 2. 元 26 | * 今/吾有一元,曰三/「「问天地好在」」/陰,名之曰「甲」 27 | 3. 列 28 | * 今/吾有一列,曰「甲」。充「甲」以四。以二。 29 | 4. 物 30 | * 今/吾有一物。名之曰「甲」。其物如是。物之「「乙」」者。數曰三。物之「「丙」」者。言曰「「丁」」。是謂「甲」之物也 31 | 32 | PS: 今关键字在javascript编译器中是编译为var name = this.name = value,java版编译器暂时没有做处理 33 | 34 | ###### 简化写法 35 | 36 | 有\[type\]\[value\]。名之曰\[name\] 37 | 38 | 有數五十。名之曰「大衍」。 39 | 40 | > 替换 41 | 42 | 昔之\[before\],今\[after\]是也/矣 43 | 44 | 译作: before = after 45 | 46 | PS: `也`一般作为`若非`和`若....者`的结束标志,如果不结束代码块,请使用`矣` 47 | 48 | > 其他 49 | 50 | 您可以可以在初始化的时候使用其他变量,如 51 | 52 | 吾有一數,曰「甲」,名之曰「乙」 53 | 54 | 译作: var 乙 = 甲; 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/lang/格物.wy: -------------------------------------------------------------------------------- 1 | 疏曰『 2 | 3 | 此經乃改編者以順java之道 4 | 5 | 參見 https://github.com/wenyan-lang/wenyan/tree/master/lib 6 | 7 | 8 | 』 9 | 今有一術。名之曰「取物」。欲行是術。必先得一物曰「物」。一言曰「端」。乃行是術曰。 10 | 施「{ obj,x -> obj[x]}」於「物」於「端」。乃得矣。 11 | 是謂「取物」之術也。 12 | 13 | 今有一術。名之曰「置物」。欲行是術。必先得一物曰「物」。一言曰「端」。一元曰「實」。乃行是術曰。 14 | 施「{obj,x,v -> obj[x] = v}」於「物」於「端」於「實」。 15 | 是謂「置物」之術也。 16 | 17 | 今有一術。名之曰「列物之端」。欲行是術。必先得一物曰「物」。乃行是術曰。 18 | 施「{x -> ArrayUtils.toJSArray(x).keys()}」於「物」乃得矣。 19 | 是謂「列物之端」之術也。 20 | 21 | 今有一術。名之曰「識類」。欲行是術。必先得一元曰「元」。乃行是術曰。 22 | 施「{ 23 | x-> 24 | switch(x.getClass().getName()){ 25 | case "java.lang.Integer": 26 | case "java.math.BigInteger": 27 | case "java.math.BigDecimal": 28 | return "數" 29 | case "cn.wenyan.compiler.lib.JSArray": 30 | return "列" 31 | case "java.lang.String": 32 | return "言" 33 | case "java.lang.Boolean": 34 | return "爻" 35 | case "java.util.LinkedHashMap": 36 | return "物" 37 | default: 38 | return x.getClass().getName() 39 | } 40 | }」於「元」乃得矣。 41 | 是謂「識類」之術也。 -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/command/CompileFileCommand.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.command; 2 | 3 | import org.apache.commons.io.FileUtils; 4 | 5 | import java.io.File; 6 | import java.io.IOException; 7 | 8 | public class CompileFileCommand extends Command { 9 | 10 | public CompileFileCommand() { 11 | super("-c",2); 12 | } 13 | 14 | @Override 15 | public Object execute(String[] args, CompilerConfig compilerConfig) { 16 | String name = args[0]; 17 | if(name.startsWith("@")){ 18 | name = name.substring(name.indexOf("@")+1); 19 | try { 20 | compilerConfig.setCompileFiles(FileUtils.readLines(new File(name), System.getProperty("file.codings")).toArray(new String[0])); 21 | }catch (IOException e){ 22 | System.err.println("-----> No Such File"); 23 | } 24 | }else{ 25 | compilerConfig.setCompileFiles(name); 26 | } 27 | compilerConfig.setOutFile(args[1]); 28 | return null; 29 | } 30 | 31 | @Override 32 | public String help() { 33 | return "参数: makeFile和outFile,设置编译文件路径,如@MakeFile.txt或者HelloWorld.wy,后面是输出的文件夹根目录"; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/CompileResult.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler; 2 | 3 | import cn.wenyan.compiler.utils.Utils; 4 | 5 | 6 | import java.util.Collections; 7 | import java.util.List; 8 | 9 | /** 10 | * 欲语此类用者何,成名一诗少不了。 11 | * 12 | * 若使君知何成者,成果皆或败事否。 13 | * 功成不少家书至,故以两者记事和。 14 | * 15 | * 此用流程以明理,成功之字以终行。 16 | * 此用流程以明志,结果之符以结行。 17 | * 18 | * 春风君者何时至,红灯不删绿灯鸣。 19 | */ 20 | public class CompileResult { 21 | 22 | private boolean success; 23 | 24 | private List result; 25 | 26 | public CompileResult(boolean success, List result) { 27 | this.success = success; 28 | this.result = result; 29 | } 30 | 31 | public CompileResult(String result){ 32 | this.success = true; 33 | this.result = Collections.singletonList(result); 34 | } 35 | 36 | public List getResult() { 37 | return result; 38 | } 39 | 40 | public boolean isSuccess() { 41 | return success; 42 | } 43 | 44 | public void setResult(List result) { 45 | this.result = result; 46 | } 47 | 48 | @Override 49 | public String toString() { 50 | return Utils.getWenyanFromArray(result.toArray(new String[0])); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/GroovyCompiler.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler; 2 | 3 | import groovy.lang.GroovyClassLoader; 4 | 5 | /** 6 | * 7 | * 欲语此类用者何,成名一诗少不了。 8 | * 9 | * 若以成者行此中,必先编译以横行。 10 | * 此类不出实体者,即编即用以交互。 11 | * 12 | * 先得加载对象者,终以源码得英雄, 13 | * 此类内涵不言耳,故以工具以敝之。 14 | * 15 | */ 16 | public class GroovyCompiler implements LanguageCompiler{ 17 | 18 | /** 19 | * 获取脚本的class 20 | * @param script 21 | * @return 22 | */ 23 | public Class compile(String script) { 24 | GroovyClassLoader loader = getDefaultParentGroovyClassLoader(); 25 | return loader.parseClass(script); 26 | } 27 | 28 | /** 29 | * 获取脚本的class对象 30 | * @param script groovy 脚本 31 | * @param className 类名字 32 | */ 33 | public Class compile(String script, String className) { 34 | GroovyClassLoader loader = getDefaultParentGroovyClassLoader(); 35 | return loader.parseClass(script, className); 36 | } 37 | 38 | /** 39 | * 默认的父加载器为GroovyCompiler().getClass().getClassLoader() 40 | * @return 返回groovy的类加载器 41 | */ 42 | private GroovyClassLoader getDefaultParentGroovyClassLoader() { 43 | ClassLoader cl = GroovyCompiler.class.getClassLoader(); 44 | return new GroovyClassLoader(cl); 45 | } 46 | 47 | 48 | } -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/utils/GroovyPrettyCode.groovy: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.utils 2 | 3 | import groovy.transform.CompileStatic; 4 | 5 | @CompileStatic 6 | class GroovyPrettyCode implements PrettyCode { 7 | 8 | @Override 9 | String pretty(String string) { 10 | StringBuilder builder = new StringBuilder() 11 | int close = 0 //检验是否在字符串里 12 | //字符串的数量%2 == 0 13 | List l = GroovyUtils.splitGroovyCode(string,"\n") 14 | for(String code in l){ 15 | int clo = getClose(code) 16 | if(clo < 0){ 17 | close += clo 18 | } 19 | builder.append("\t"*close).append(code).append("\n") 20 | if(clo > 0){ 21 | close += clo 22 | } 23 | } 24 | return builder 25 | } 26 | 27 | private static int getClose(String code){ 28 | int close = 0 29 | int string = 0 30 | for(s in code){ 31 | if(s == "'"||s == "\"") { 32 | string ++ 33 | } 34 | if(string %2 == 0){ 35 | if(s == "{"){ 36 | close ++ 37 | } 38 | if(s == "}"){ 39 | close -- 40 | } 41 | } 42 | } 43 | close 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/script/libs/Library.groovy: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.script.libs 2 | 3 | import groovy.transform.CompileStatic 4 | 5 | @CompileStatic 6 | class Library { 7 | 8 | private Language language 9 | 10 | Library(Language language) { 11 | this.language = language 12 | } 13 | 14 | private final Map> libs = [ 15 | (Language.GROOVY) : [ 16 | "算經" : "cn.wenyan.lang.算經", 17 | "位經" : "cn.wenyan.lang.位經", 18 | "列經" : "cn.wenyan.lang.列經", 19 | "物經" : "cn.wenyan.lang.物經", 20 | "易經" : "cn.wenyan.lang.易經", 21 | "格物" : "cn.wenyan.lang.格物", 22 | "渾沌經":"cn.wenyan.lang.渾沌經", 23 | "曆法":"cn.wenyan.lang.曆法", 24 | "曆表":"cn.wenyan.lang.曆表", 25 | "西曆法":"cn.wenyan.lang.西曆法", 26 | "籌經":"cn.wenyan.lang.籌經", 27 | "畫譜":"cn.wenyan.lang.畫譜" 28 | ] 29 | ] 30 | 31 | Map getLibs(){ 32 | return libs.get(language) 33 | } 34 | 35 | void addLib(String name,String packageName){ 36 | libs.get(language).put(name,packageName) 37 | } 38 | 39 | String get(String name){ 40 | String n = getLibs().get(name) 41 | return n == null?name:n 42 | } 43 | } -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/streams/CommentCompileStream.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.streams; 2 | 3 | import cn.wenyan.compiler.CompileResult; 4 | import cn.wenyan.compiler.WenYanCompilerImpl; 5 | import cn.wenyan.compiler.WenYanLib; 6 | import cn.wenyan.compiler.script.libs.LanguageUtils; 7 | import cn.wenyan.compiler.utils.Utils; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * 此为批注之编译流。亦可编译"注释"之术,曰: 经必有注也。 13 | * 批曰。「「文氣淋灕。字句切實」」。 14 | * 注曰。「「文言備矣」」。 15 | * 疏曰。「「居第一之位故稱初。以其陽爻故稱九」」。 16 | * 此术数亦在运行时忽略之。 17 | * 18 | * @author MagicLu 19 | * @see CompileStream 20 | */ 21 | public class CommentCompileStream extends CompileStream { 22 | 23 | 24 | public CommentCompileStream(WenYanCompilerImpl compiler) { 25 | super(compiler); 26 | } 27 | 28 | /** 29 | * 译之,若不成,则予下一流,反则为原文者乎 30 | * @param wenyan 上一流之返回者,亦为尚否编译者也 31 | * @return 编译之果 32 | */ 33 | @Override 34 | public CompileResult compile(List wenyan) { 35 | if(Utils.matches(wenyan, WenYanLib.NEW_COMMENT())){ 36 | compiler.removeWenyan(); 37 | String value02 = compiler.removeWenyan(); 38 | return new CompileResult(LanguageUtils.addComment(language, 39 | Utils.getStringFrom(WenYanLib.COMMENT(),value02,WenYanLib.STRING_START(),WenYanLib.STRING_END()) 40 | 41 | )); 42 | } 43 | return new CompileResult(false,wenyan); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/lib/ArrayUtils.groovy: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.lib 2 | 3 | class ArrayUtils { 4 | static def getIndex(index){ 5 | if(index instanceof Integer)return (Integer)index - 1 6 | if(index instanceof BigInteger)return (BigInteger)index -1 7 | return index 8 | } 9 | 10 | static def getArray(array){ 11 | return array.getClass() == HashMap.Node.class?array.getValue():array 12 | } 13 | 14 | static JSArray toJSArray(array){ 15 | if(array instanceof JSArray){ 16 | return array 17 | } 18 | JSArray js = new JSArray() 19 | for(v in array){ 20 | js.add(v) 21 | } 22 | return js 23 | } 24 | 25 | static def slice(str){ 26 | if(str.getClass().isArray()){ 27 | def arr = Arrays.asList(str) 28 | return arr.subList(1,arr.size()) 29 | } 30 | if(str instanceof List){ 31 | def list = new ArrayList(str) 32 | return new ArrayList<>(list.subList(1,list.size())) 33 | } 34 | if(str instanceof JSArray){ 35 | return str.slice(1) 36 | } 37 | if(str instanceof String){ 38 | return str.substring(1) 39 | } 40 | throw new RuntimeException("No Such Function: slice") 41 | } 42 | 43 | static def length(str){ 44 | if(str.getClass().isArray())return str.length 45 | if(str instanceof List) return str.size() 46 | if(str instanceof String) return str.length() 47 | if(str instanceof JSArray) return str.size() 48 | if(str instanceof Map) return str.size() 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/Main.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler; 2 | 3 | 4 | import cn.wenyan.compiler.command.CommandHandler; 5 | import cn.wenyan.compiler.script.libs.Language; 6 | import cn.wenyan.compiler.utils.ScalaUtils; 7 | import groovy.lang.GroovyClassLoader; 8 | 9 | import java.io.File; 10 | 11 | /** 12 | * 万事开头必有难,指令重器蔑则空。 13 | * 以此以动编译者,指令皆可为君用。 14 | * 亦可帮助亦可行,亦可脚本亦可成。 15 | * 程式终创一场空,来也来去皆也净。 16 | * 17 | * 诚心默念爪哇好,不忘恩赐来世重。 18 | * 19 | */ 20 | 21 | public class Main { 22 | 23 | public static void main(String[] args) { 24 | if (args.length == 1 && args[0].equals("shell")) { 25 | WenYanShell.run(); 26 | return; 27 | } 28 | if (args.length == 2 && args[0].equals("run")) { 29 | try { 30 | Class runner = new GroovyClassLoader(Main.class.getClassLoader()).parseClass(new File(args[1])); 31 | runner.getDeclaredMethod("main", String[].class).invoke(null, (Object) args); 32 | } catch (Exception e) { 33 | e.printStackTrace(); 34 | return; 35 | } 36 | } 37 | 38 | if (args.length == 0 || args[0].equals("help")) { 39 | CommandHandler.compileCommand.entrySet().stream().forEach(x -> System.out.println(x.getValue().getOption() + ": " + x.getValue().help())); 40 | return; 41 | } 42 | 43 | WenYanCompilerImpl compiler = new WenYanCompilerImpl(false, Language.GROOVY); 44 | long time = ScalaUtils.countTime(() -> { 45 | compiler.compile(args); 46 | return null; 47 | }); 48 | compiler.getServerLogger().debug("Use: " + time + "ms"); 49 | 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/utils/VarLabel.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.utils; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | import java.util.Set; 6 | 7 | public class VarLabel { 8 | 9 | 10 | private String name; 11 | 12 | private Map alis; 13 | 14 | private Map lastName; 15 | 16 | public VarLabel() { 17 | this.alis = new HashMap<>(); 18 | this.lastName = new HashMap<>(); 19 | } 20 | 21 | public String getName() { 22 | return name; 23 | } 24 | 25 | public void setName(String name) { 26 | this.name = name; 27 | } 28 | 29 | 30 | public void addAlis(String funcName,int index,String ali) { 31 | alis.put(funcName+"@"+index,ali); 32 | } 33 | 34 | public String getAlis(String funcName,int ind,boolean defineArg){ 35 | String index = funcName+"@"+ind; 36 | if(defineArg){ 37 | if(!alis.containsKey(index)){ 38 | String n = name+"__"+ind+"__"+funcName; 39 | alis.put(index,n); 40 | lastName.put(index,n); 41 | } 42 | }else{ 43 | if(!alis.containsKey(index)){ 44 | String ln = lastName.get(index); 45 | alis.put(index,ln==null?name:ln); 46 | lastName.put(index,name); 47 | } 48 | } 49 | return alis.get(index); 50 | } 51 | 52 | private String getIndex(int ind){ 53 | ind = ind-1; 54 | Set set = alis.keySet(); 55 | for(String s : set){ 56 | if(ind == Integer.parseInt(s.split("@")[1])){ 57 | return s; 58 | } 59 | } 60 | return null; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/factory/CompileFactory.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.factory; 2 | 3 | import cn.wenyan.compiler.CompileResult; 4 | import cn.wenyan.compiler.WenYanCompilerImpl; 5 | import cn.wenyan.compiler.streams.CompileStream; 6 | import cn.wenyan.compiler.utils.Assert; 7 | 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | 11 | public class CompileFactory { 12 | 13 | private List streamList; 14 | 15 | private WenYanCompilerImpl compiler; 16 | 17 | private List copy; 18 | 19 | public CompileFactory(List streams,WenYanCompilerImpl compiler){ 20 | this.compiler = compiler; 21 | this.streamList = streams; 22 | } 23 | 24 | public void addStream(List stream,Class after){ 25 | for(int i = 0;i compile(int index,List wenyan){ 34 | copy = new ArrayList<>(); 35 | copy.addAll(wenyan); 36 | for(CompileStream stream : streamList){ 37 | compiler.callListenerStart(stream,wenyan); 38 | CompileResult result = stream.compile(wenyan); 39 | if(result.isSuccess()){ 40 | compiler.callListenerEnd(stream,result.getResult()); 41 | return result.getResult(); 42 | }else{ 43 | if(!wenyan.equals(copy)){ 44 | wenyan.clear(); 45 | wenyan.addAll(copy); 46 | compiler.clearIndexCode(); 47 | } 48 | compiler.callListenerFailed(stream,wenyan); 49 | } 50 | } 51 | return Assert.syntaxError(index+"语句组 Line: "+(compiler.getIndexCode())+": "+wenyan.get(0)); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/streams/ObjectCompileStream.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.streams; 2 | 3 | import cn.wenyan.compiler.CompileResult; 4 | import cn.wenyan.compiler.WenYanCompilerImpl; 5 | import cn.wenyan.compiler.WenYanLib; 6 | import cn.wenyan.compiler.script.libs.LanguageUtils; 7 | import cn.wenyan.compiler.script.libs.Syntax; 8 | import cn.wenyan.compiler.utils.Utils; 9 | 10 | import java.util.List; 11 | 12 | public class ObjectCompileStream extends CompileStream{ 13 | 14 | public ObjectCompileStream(WenYanCompilerImpl compiler) { 15 | super(compiler); 16 | } 17 | 18 | @Override 19 | public CompileResult compile(List wenyan) { 20 | VariableCompileStream stream = compiler.getStream(VariableCompileStream.class); 21 | if(Utils.matches(wenyan, WenYanLib.OBJECT_IT())){ 22 | compiler.removeWenyan(); 23 | StringBuilder builder = new StringBuilder(); 24 | String arrName = stream.getNowName(); 25 | while (true){ 26 | if(Utils.matches(wenyan,WenYanLib.GIVE_OBJECT())) { 27 | String nameDefine = compiler.removeWenyan(); 28 | String valueDefine; 29 | if(Utils.matches(wenyan,WenYanLib.GIVE_OBJECT_VALUE())){ 30 | valueDefine = compiler.removeWenyan(); 31 | }else { 32 | valueDefine = language.getSyntax(Syntax.NULL); 33 | 34 | } 35 | 36 | String name = Utils.getValue(Utils.getString(WenYanLib.STRING(), nameDefine), stream,true); 37 | String value = Utils.getValue(valueDefine.substring(valueDefine.indexOf("曰") + 1),stream); 38 | builder.append(LanguageUtils.arraySet(language, arrName, name, value)).append("\n"); 39 | }else{ 40 | if(Utils.matches(wenyan,WenYanLib.OBJECT_END())){ 41 | compiler.removeWenyan(); 42 | } 43 | break; 44 | } 45 | } 46 | return new CompileResult(builder.toString()); 47 | } 48 | return new CompileResult(false,wenyan); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /.idea/wenyan-jvm.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/utils/NumberTree.groovy: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.utils 2 | 3 | import groovy.transform.CompileStatic 4 | 5 | import java.util.stream.Collectors; 6 | 7 | @CompileStatic 8 | class NumberTree { 9 | 10 | private int prefix = 1 11 | 12 | private Node root = new Node() 13 | 14 | private BigDecimal floatValue = 0 15 | 16 | private List nodes = new ArrayList<>() 17 | 18 | void inputNumber(String wenyan,Node node){ 19 | node.value = wenyan 20 | int index = GroovyUtils.getMax(wenyan) 21 | nodes.remove(node.parent) 22 | nodes.add(node) 23 | if(wenyan.size() == 1)return 24 | if(index == -1)return 25 | String left = wenyan.substring(0,index) 26 | left = left.empty?"一":left 27 | String right = wenyan.substring(index+1) 28 | String max = wenyan.charAt(index) 29 | node.left = new Node() 30 | node.right = new Node() 31 | node.middle = new Node() 32 | node.left.value = left 33 | node.left.parent = node 34 | node.middle.value = max 35 | node.middle.parent = node 36 | node.right.value = right 37 | node.right.parent = node 38 | inputNumber(left,node.left) 39 | inputNumber(max,node.middle) 40 | inputNumber(right,node.right) 41 | } 42 | 43 | NumberTree inputNumber(String wenyan){ 44 | if(wenyan.startsWith("負")){ 45 | prefix = -prefix 46 | wenyan = wenyan.substring(1) 47 | } 48 | if(wenyan.contains("又")){ 49 | def numbers = wenyan.split("又") 50 | inputNumber(numbers[0],root) 51 | floatValue = GroovyUtils.getNumber(numbers[1]) 52 | }else{ 53 | inputNumber(wenyan,root) 54 | } 55 | this 56 | } 57 | 58 | BigDecimal convertToNumber(){ 59 | BigDecimal result = 0 60 | for(int i = 0;i compileToClass(String className,String... wenyanString); 52 | 53 | void runFile(String file,String[] args); 54 | 55 | void runFile(String file); 56 | 57 | void runFile(File file) throws IOException; 58 | 59 | // = compile(wenyan) 60 | String dispatch(String wenyan); 61 | 62 | // 简体中文 to 繁体中文 63 | String getTraditionalChinese(String wenyan); 64 | } 65 | 66 | ``` 67 | 68 | #### Current progress 69 | 70 | 1. Currently in development, not all syntax is complete 71 | 2. The syntax of the implementation can be found in [README](https://github.com/MagicLu550/wenyan-lang_jvm/blob/master/README.md) 72 | 73 | -------------------------------------------------------------------------------- /project_example/src/main/java/藏書樓/子曰/序.wy: -------------------------------------------------------------------------------- 1 | 今有一術。名之曰「子曰」。欲行是術。必先得一言。曰「言」。乃行是術曰。 2 | 3 | 吾有一言。曰「「 __._ 」」。 書之。 4 | 吾有一言。曰「「 / ___)_ 」」。 書之。 5 | 吾有一言。曰「「 (_/Y ===\\ __ 」」。 書之。 6 | 吾有一言。曰「「 |||.==. =). | 」」。 書之。 7 | 吾有一言。曰「「 |((| o |p| | 」」。加其以「言」。書之。 8 | 吾有一言。曰「「 _./| \\( /=\\ ) |__ 」」。 書之。 9 | 吾有一言。曰「「 / |@\\ ||||||||. 」」。 書之。 10 | 吾有一言。曰「「 / \\@\\ ||||||||\\ 」」。 書之。 11 | 吾有一言。曰「「 / \\ \\@\\ ||||||//\\ 」」。 書之。 12 | 吾有一言。曰「「 ( Y \\@\\|||| // _\\ 」」。 書之。 13 | 吾有一言。曰「「 | -\\ \\@\\ \\\\// \\ 」」。 書之。 14 | 吾有一言。曰「「 | -\\__.-./ //\\.---.^__ 」」。 書之。 15 | 吾有一言。曰「「 | \\ / |@|__/\\_|@| | | 」」。 書之。 16 | 吾有一言。曰「「 \\__\\ |@||| |||@| | 」」。 書之。 17 | 吾有一言。曰「「 <@@@| |@||| |||@| / 」」。 書之。 18 | 吾有一言。曰「「 / ---| /@||| |||@| / 」」。 書之。 19 | 吾有一言。曰「「 | /| /@/ || |||@| /| 」」。 書之。 20 | 吾有一言。曰「「 | //| /@/ ||_|||@| / | 」」。 書之。 21 | 吾有一言。曰「「 | // \\ ||@| /|=|||@| | | 」」。 書之。 22 | 吾有一言。曰「「 \\ // \\||@| / |/|||@| \\ | 」」。 書之。 23 | 吾有一言。曰「「 |// ||@| / ,/|||@| | 」」。 書之。 24 | 吾有一言。曰「「 // ||@|/ /|/||/@/ | 」」。 書之。 25 | 吾有一言。曰「「 //| , ||// /\\|/\\/@/ / / 」」。 書之。 26 | 吾有一言。曰「「 //\\ / \\|/ /H\\|/H\\/ /_/ 」」。 書之。 27 | 吾有一言。曰「「 // |\\_/ |__/|H\\|/H|\\_/ 」」。 書之。 28 | 吾有一言。曰「「 |/ |\\ / |H===H| | 」」。 書之。 29 | 吾有一言。曰「「 ||\\ /| |H|||H| | 」」。 書之。 30 | 吾有一言。曰「「 ||______/ | |H|||H| | 」」。 書之。 31 | 吾有一言。曰「「 \\_/ _/ _/ |L|||J| \\_ 」」。 書之。 32 | 吾有一言。曰「「 _/ ___/ ___\\__/___ '-._ 」」。 書之。 33 | 吾有一言。曰「「 /__________/===\\__/===\\---' 」」。 書之。 34 | 吾有一言。曰「「 」」。 書之。 35 | 36 | 是謂「子曰」之術也。 37 | 38 | 或云「「子曰「甲」」」。 39 | 蓋謂「「施「子曰」於「甲」」」。 -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/lang/列經.wy: -------------------------------------------------------------------------------- 1 | 疏曰『 2 | 3 | 此經乃改編者以順java之道 4 | 5 | 參見 https://github.com/wenyan-lang/wenyan/tree/master/lib 6 | 7 | 8 | 』 9 | 或云「「凡「甲」皆「乙」其上者」」。 10 | 蓋謂「「施「遍施」於「乙」於「甲」」」 11 | 12 | 或云「「唯「甲」中得「乙」者」」 13 | 蓋謂「「施「篩剔」於「乙」於「甲」」」 14 | 15 | 或云「「併「甲」於「乙」以「丙」者」」 16 | 蓋謂「「施「左併」於「丙」於「乙」於「甲」」」 17 | 18 | 注曰「「遍施。同Javascript之Array.forEach也。」」 19 | 今有一術。名之曰「遍施」。欲行是術。必先得一術。曰「甲」。一列。曰「乙」。乃行是術曰。 20 | 吾有一列。名之曰「丙」。 21 | 凡「乙」中之「丁」。 22 | 施「甲」於「丁」。充「丙」以其也。 23 | 乃得「丙」。 24 | 是謂「遍施」之術也。 25 | 26 | 注曰「「篩剔。同Javascript之Array.filter也。」」 27 | 今有一術。名之曰「篩剔」。欲行是術。必先得一術。曰「甲」。一列。曰「乙」。乃行是術曰。 28 | 吾有一列。名之曰「丙」。 29 | 凡「乙」中之「丁」。 30 | 施「甲」於「丁」。 31 | 若其者。充「丙」以「丁」也。 32 | 云云。 33 | 乃得「丙」。 34 | 是謂「篩剔」之術也。 35 | 36 | 今有一術。名之曰「左併」。欲行是術。必先得一術。曰「甲」。一元。曰「乙」。一列。曰「丙」。乃行是術曰。 37 | 吾有一元曰「乙」。名之曰「丁」。 38 | 凡「丙」中之「戊」。 39 | 施「甲」於「丁」於「戊」。 40 | 昔之「丁」者。今其是矣。 41 | 云云。 42 | 乃得「丁」。 43 | 是謂「左併」之術也。 44 | 45 | 46 | 今有一術。名之曰「右併」。欲行是術。必先得一術。曰「甲」。一元。曰「乙」。一列。曰「丙」。乃行是術曰。 47 | 吾有一元曰「乙」。名之曰「丁」。 48 | 夫「丙」之長。名之曰「戊」。 49 | 恆為是。若「戊」小於一者乃止也。 50 | 夫「丙」之「戊」。夫「丁」。取二以施「甲」。 51 | 昔之「丁」者。今其是矣。 52 | 減「戊」以一。昔之「戊」者。今其是矣。云云。 53 | 乃得「丁」。 54 | 是謂「右併」之術也。 55 | 56 | 注曰「「排序。同Javascript之Array.sort也。」」 57 | 今有一術。名之曰「排序」。欲行是術。必先得一術。曰「甲」。一列。曰「乙」。乃行是術曰。 58 | 59 | 若「乙」之長不大於一者。乃得「乙」也。 60 | 吾有三列。名之曰「首」。曰「頷」。曰「尾」。 61 | 62 | 夫「乙」之一。名之曰「乙一」。 63 | 充「頷」以「乙一」。 64 | 夫「乙」之其餘。名之曰「乙餘」。 65 | 66 | 凡「乙餘」中之「丁」。 67 | 施「甲」於「丁」於「乙一」。 68 | 若其小於零者。 69 | 充「首」以「丁」。 70 | 若非。 71 | 充「尾」以「丁」 72 | 也。 73 | 云云。 74 | 施「排序」於「甲」於「首」。昔之「首」者。今其是矣。 75 | 施「排序」於「甲」於「尾」。昔之「尾」者。今其是矣。 76 | 77 | 銜「首」以「頷」以「尾」。名之曰「丙」。 78 | 乃得「丙」。 79 | 80 | 是謂「排序」之術也。 81 | 82 | 注曰「「倒序。同Javascript之Array.reverse也。」」 83 | 今有一術。名之曰「倒序」。欲行是術。必先得一列。曰「甲」。乃行是術曰。 84 | 吾有一列。名之曰「乙」。 85 | 夫「甲」之長。名之曰「戊」。 86 | 恆為是。若「戊」小於一者乃止也。 87 | 夫「甲」之「戊」。充「乙」以其。 88 | 減「戊」以一。昔之「戊」者。今其是矣。云云。 89 | 乃得「乙」。 90 | 是謂「倒序」之術也。 91 | 92 | 注曰「「擷取。同Javascript之Array.slice也。」」 93 | 今有一術。名之曰「擷取」。欲行是術。必先得一列。曰「甲」。二數。曰「乙」曰「丙」。乃行是術曰。 94 | 吾有一列。名之曰「丁」。 95 | 吾有一數。曰「乙」。名之曰「戊」。 96 | 若「丙」小於零者。夫「甲」之長。加其以「丙」。昔之「丙」者。今其是矣。云云。 97 | 98 | 恆為是。若「戊」大於「丙」者乃止也。 99 | 夫「甲」之「戊」。充「丁」以其。 100 | 加「戊」以一。昔之「戊」者。今其是矣。云云。 101 | 乃得「丙」。 102 | 103 | 是謂「擷取」之術也。 104 | 105 | 106 | 今有一術。名之曰「製列」。欲行是術。必先得一數。曰「甲」。一術。曰「乙」。一列。曰「丙」。乃行是術曰。 107 | 吾有一列。名之曰「丁」。 108 | 吾有一數曰一。名之曰「戊」。 109 | 110 | 恆為是。若「戊」大於「甲」者乃止也。 111 | 施「乙」於「戊」。充「丁」以其。 112 | 加「戊」以一。昔之「戊」者。今其是矣。云云。 113 | 乃得「丁」。 114 | 是謂「製列」之術也。 115 | 116 | 117 | 今有一術。名之曰「索一」。欲行是術。必先得一列。曰「甲」。一元。曰「乙」。乃行是術曰。 118 | 吾有一數曰一。名之曰「戊」。 119 | 恆為是。若「戊」大於「甲」之長者乃止也。 120 | 若「乙」等於「甲」之「戊」者。乃得「戊」也。 121 | 加「戊」以一。昔之「戊」者。今其是矣。云云。 122 | 乃得負一。 123 | 是謂「索一」之術也。 124 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/command/CommandHandler.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.command; 2 | 3 | import cn.wenyan.compiler.WenYanCompilerImpl; 4 | import cn.wenyan.compiler.exceptions.CommandException; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | import java.util.Map; 9 | import java.util.concurrent.ConcurrentHashMap; 10 | 11 | public class CommandHandler { 12 | 13 | public static Map compileCommand = new ConcurrentHashMap<>(); 14 | 15 | private WenYanCompilerImpl compiler; 16 | 17 | static { 18 | registerCommands(); 19 | } 20 | 21 | public static void registerCommands(){ 22 | compileCommand.put("-p",new PinYinCommand()); 23 | compileCommand.put("-c",new CompileFileCommand()); 24 | compileCommand.put("-o",new OutFileCommand()); 25 | compileCommand.put("-l",new CompileLibCommand()); 26 | compileCommand.put("-r",new RunCommand()); 27 | compileCommand.put("-sc",new SourceCommand()); 28 | compileCommand.put("-m",new MainClassCommand()); 29 | compileCommand.put("-g",new GroovyCommand()); 30 | compileCommand.put("-n",new ClassFileCommand()); 31 | compileCommand.put("-wyg",new WenYuanGeCommand()); 32 | compileCommand.put("-wd",new WenYuanGeDownloadCommand()); 33 | compileCommand.put("-lv",new LexerViewerCommand()); 34 | compileCommand.put("-st",new StrongTypeCommand()); 35 | } 36 | 37 | public CommandHandler(WenYanCompilerImpl compiler){ 38 | this.compiler =compiler; 39 | } 40 | 41 | public int executeCommand(String[] args){ 42 | CompilerConfig compilerConfig = new CompilerConfig(); 43 | for(int index = 0;index arr = new ArrayList<>(); 45 | Command command = compileCommand.get(args[index]); 46 | if(command!=null){ 47 | int len = command.getArgsLength(); 48 | if(len == -1){ 49 | for(int j = 0;index getCompileCommand() { 70 | return compileCommand; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/plugins/PluginManager.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.plugins; 2 | 3 | import cn.wenyan.compiler.WenYanCompilerImpl; 4 | import cn.wenyan.compiler.WenYanLib; 5 | import cn.wenyan.compiler.streams.CompileStream; 6 | import cn.wenyan.compiler.utils.Utils; 7 | 8 | import java.io.File; 9 | import java.io.IOException; 10 | import java.util.*; 11 | import java.util.jar.JarEntry; 12 | import java.util.jar.JarFile; 13 | 14 | public class PluginManager { 15 | 16 | private Map plugins = new HashMap<>(); 17 | 18 | private WenYanCompilerImpl compiler; 19 | 20 | public PluginManager(WenYanCompilerImpl impl){ 21 | this.compiler = impl; 22 | } 23 | 24 | public Plugin loadPlugin(File file){ 25 | try { 26 | JavaPluginClassloader cl = new JavaPluginClassloader(file); 27 | JarFile jar = new JarFile(file); 28 | Main main = null; 29 | Enumeration entries = jar.entries(); 30 | while (entries.hasMoreElements()){ 31 | JarEntry entry = entries.nextElement(); 32 | String name = Utils.getClassName(entry.getName()); 33 | Class clz = cl.loadClass(name); 34 | main = (Main) clz.getAnnotation(Main.class); 35 | if(main != null){ 36 | break; 37 | } 38 | } 39 | if(main == null){ 40 | throw new ClassNotFoundException("No main class"); 41 | }else{ 42 | String name = main.name(); 43 | Class clz = main.after(); 44 | try { 45 | Plugin plugin = (Plugin) clz.newInstance(); 46 | List streamList = new ArrayList<>(); 47 | List listeners = new ArrayList<>(); 48 | plugin.addCompileStream(streamList); 49 | plugin.addSyntaxRegex(WenYanLib.syntaxs()); 50 | plugin.addListener(listeners); 51 | plugin.addPatterns(WenYanLib.patterns()); 52 | compiler.getFactory().addStream(streamList,clz); 53 | compiler.getListeners().addAll(listeners); 54 | plugins.put(name,plugin); 55 | compiler.getServerLogger().info("加载插件: "+name+" 成功"); 56 | return plugin; 57 | }catch (Exception e){ 58 | compiler.getServerLogger().error("",e); 59 | } 60 | 61 | } 62 | }catch (ClassNotFoundException|IOException e){ 63 | compiler.getServerLogger().error("",e); 64 | } 65 | return null; 66 | } 67 | 68 | public Map getPlugins() { 69 | return plugins; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/log/LogFormat.java: -------------------------------------------------------------------------------- 1 | /* 2 | Jsmod2 is a java-based scpsl cn.jsmod2.server initiated by jsmod2.cn. 3 | It needs to rely on smod2 and proxy. jsmod2 is an open source 4 | free plugin that is released under the GNU license. Please read 5 | the GNU open source license before using the software. To understand 6 | the appropriateness, if infringement, will be handled in accordance 7 | with the law, @Copyright Jsmod2 China,more can see that 8 | */ 9 | package cn.wenyan.compiler.log; 10 | 11 | import org.fusesource.jansi.Ansi; 12 | 13 | import java.time.LocalDateTime; 14 | import java.time.format.DateTimeFormatter; 15 | import java.util.HashMap; 16 | import java.util.Map; 17 | 18 | import static org.fusesource.jansi.Ansi.Color.*; 19 | 20 | public class LogFormat { 21 | 22 | private static Map colors; 23 | 24 | static { 25 | colors = new HashMap<>(); 26 | colors.put(BLACK,"\033[30m"); 27 | colors.put(RED,"\033[31m"); 28 | colors.put(GREEN,"\033[32m"); 29 | colors.put(YELLOW,"\033[33m"); 30 | colors.put(BLUE,"\033[34m"); 31 | colors.put(MAGENTA,"\033[35m"); 32 | colors.put(CYAN,"\033[36m"); 33 | colors.put(WHITE,"\033[37m"); 34 | colors.put(DEFAULT,"\033[0m"); 35 | } 36 | 37 | public static String fg(Ansi.Color c){ 38 | return colors.get(c); 39 | } 40 | 41 | private static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss"); 42 | 43 | public static String format(String message, String type, Ansi.Color color,String prefix){ 44 | return format(message,type,color,prefix,false); 45 | } 46 | 47 | public static String format(String message, String type, Ansi.Color color,String prefix,boolean controlMain){ 48 | return prefix+fg(MAGENTA)+dateTimeFormatter.format(LocalDateTime.now())+fg(DEFAULT)+"["+fg(color)+(controlMain?control(type, Control.GLISTEN):type)+fg(DEFAULT)+"\t]"+fg(DEFAULT)+" "+message; 49 | //return ansi().eraseScreen().a(prefix).fg(MAGENTA).a(dateTimeFormatter.format(LocalDateTime.now())).fg(DEFAULT).a("[").fg(color).a(type).fg(DEFAULT).a("\t]").fg(BLUE).a(" "+message).reset(); 50 | } 51 | 52 | public static String textFormat(String message, Ansi.Color color){ 53 | return fg(color)+message; 54 | //return ansi().eraseScreen().fg(color).a(message).reset(); 55 | } 56 | 57 | public static String control(String message,Control c){ 58 | return c.getAnsi()+message; 59 | } 60 | 61 | public enum Control{ 62 | 63 | GLISTEN("\033[5m"), 64 | 65 | BOLD("\033[1m"); 66 | 67 | private String ansi; 68 | Control(String ansi){ 69 | this.ansi = ansi; 70 | } 71 | 72 | public String getAnsi() { 73 | return ansi; 74 | } 75 | } 76 | 77 | } 78 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/lib/JSArray.groovy: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.lib 2 | 3 | import groovy.transform.CompileStatic 4 | import groovy.transform.TypeCheckingMode 5 | 6 | import java.util.Map.Entry 7 | 8 | @CompileStatic 9 | class JSArray extends HashMap { 10 | 11 | private Integer index = 0 12 | 13 | @Override 14 | def put(Object key,value) { 15 | 16 | if(key == null){ 17 | return super.put((index++) ,value) 18 | }else{ 19 | return super.put(key, value) 20 | } 21 | } 22 | 23 | def add(V value){ 24 | return put(null,value) 25 | } 26 | 27 | @Override 28 | def get(Object key) { 29 | def obj = super.get(key) 30 | if(obj == null)throw new ArrayIndexOutOfBoundsException(key.toString()) 31 | return obj 32 | } 33 | 34 | JSArray slice(int index){ 35 | if(index > this.size())return new JSArray() 36 | JSArray jsArray = (JSArray) this.clone() 37 | for(int i = 0;i= 0){ 48 | def obj = super.remove(key1) 49 | List> set = new ArrayList<>(this.entrySet()) 50 | for(int i = 0;i= k){ 55 | put(b-1,super.remove(b)) 56 | } 57 | } 58 | } 59 | return obj 60 | } 61 | return super.remove(k) 62 | } 63 | return super.remove(key) 64 | } 65 | 66 | @Override 67 | String toString() { 68 | StringBuilder builder = new StringBuilder() 69 | List> list = new ArrayList<>(entrySet()) 70 | for(int i = 0;i entry = list.get(i) 72 | if(entry.getKey().toString().matches("[0-9]+")){ 73 | builder.append(entry.getValue()).append(",") 74 | }else{ 75 | builder.append(entry.getKey()).append(":").append(entry.getValue()).append(",") 76 | } 77 | } 78 | int index = builder.lastIndexOf(",") 79 | if(index!=-1) { 80 | return builder.substring(0, index) 81 | }else{ 82 | return builder.toString() 83 | } 84 | } 85 | 86 | List keys(){ 87 | return new ArrayList<>(this.keySet()) 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/streams/ArrayCompileStream.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.streams; 2 | 3 | import cn.wenyan.compiler.CompileResult; 4 | import cn.wenyan.compiler.WenYanCompilerImpl; 5 | import cn.wenyan.compiler.WenYanLib; 6 | import cn.wenyan.compiler.script.libs.LanguageUtils; 7 | import cn.wenyan.compiler.utils.Utils; 8 | import org.codehaus.groovy.runtime.typehandling.BigDecimalMath; 9 | 10 | import java.util.List; 11 | 12 | public class ArrayCompileStream extends CompileStream { 13 | 14 | public ArrayCompileStream(WenYanCompilerImpl compiler) { 15 | super(compiler); 16 | } 17 | 18 | @Override 19 | public CompileResult compile(List wenyan) { 20 | VariableCompileStream stream = compiler.getStream(VariableCompileStream.class); 21 | if(Utils.matches(wenyan,WenYanLib.LENGTH())){ 22 | String value = compiler.removeWenyan(); 23 | return new CompileResult( 24 | LanguageUtils.defineVar(language,stream.getAnsName(),Utils.getValue(value.substring(value.indexOf("夫")+1),stream)) 25 | ); 26 | } 27 | if(Utils.matches(wenyan, WenYanLib.ADD())){ 28 | String value01 = compiler.removeWenyan(); 29 | String name = Utils.getValue(Utils.getString(WenYanLib.VAR_NAME_FOR(),value01),stream); 30 | StringBuilder result = new StringBuilder(); 31 | while (Utils.matches(wenyan,WenYanLib.VAL())){ 32 | String value02 = compiler.removeWenyan(); 33 | 34 | result.append(LanguageUtils.addArray( 35 | language, 36 | name, 37 | Utils.getValue(value02.substring(value02.indexOf(value02.charAt(0)) + 1), stream) 38 | ) 39 | ).append("\n"); 40 | } 41 | return new CompileResult(result.toString()); 42 | } 43 | if(Utils.matches(wenyan,WenYanLib.GET())){ 44 | String value = compiler.removeWenyan(); 45 | String get = value.substring(value.indexOf("夫")+1); 46 | String val = stream.getArray(get,stream); 47 | 48 | return new CompileResult( 49 | LanguageUtils.defineVar(language,stream.getAnsName(),val) 50 | ); 51 | } 52 | if(Utils.matches(wenyan,WenYanLib.CONCAT())){ 53 | String name = compiler.removeWenyan(); 54 | name = Utils.getValue(name.substring(name.indexOf("銜")+1),stream); 55 | StringBuilder builder = new StringBuilder(); 56 | while (Utils.matches(wenyan,WenYanLib.VAL())){ 57 | String value = compiler.removeWenyan(); 58 | String valueGet = Utils.getValue(value.substring(value.indexOf("以")+1),stream); 59 | builder.append(LanguageUtils.putAll(language,name,valueGet)).append("\n"); 60 | } 61 | return new CompileResult(builder.toString()); 62 | } 63 | return new CompileResult(false,wenyan); 64 | } 65 | 66 | 67 | } 68 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/script/libs/Syntax.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.script.libs; 2 | 3 | public enum Syntax { 4 | 5 | COMMENT("comment"), 6 | VAR_DEFINE("var_define"), 7 | FOR_NUMBER("for_number"), 8 | FOR_EACH("for_each"), 9 | FOR_END("for_end"), 10 | IF("if"), 11 | IF_END("if_end"), 12 | IF_BREAK("if_break"), 13 | WHILE_TRUE("while_true"), 14 | ELSE("else"), 15 | BREAK("break"), 16 | RETURN("return"), 17 | FUNCTION_END("function_end"), 18 | DEFINE_FUNCTION("define_function"), 19 | IMPORT("import"), 20 | IMPORT_STATIC("import_static"), 21 | MATH_ADD("math_+"), 22 | MATH_LESS("math_-"), 23 | MATH_MULTI("math_*"), 24 | MATH_EXCEPT("math_/"), 25 | MATH_REMAIN("math_%"), 26 | BIGGER(">"), 27 | SMALLER("<"), 28 | NOT_BIG_THAN("<="), 29 | NOT_SMALL_THAN(">="), 30 | TRUE("true"), 31 | FALSE("false"), 32 | EQUAL("=="), 33 | OR("||"), 34 | AND("&&"), 35 | PRINT("print"), 36 | NEGATE("!"), 37 | NEGATE_EQUAL("!="), 38 | CHANGE("change"), 39 | REPLACE_ARRAY("replace_array"), 40 | FUNCTION_ARGS_SPLIT("function_args_split"), 41 | IMPORT_STATIC_SEPARATE("import_static_separate"),//是否把import static给分开,如果不分开%{method}%会组合全部的'方悟xxx之义' 42 | IMPORT_SPLIT("import_split"),//如果开启了不分开,则这是分隔符 43 | STRING("string"), 44 | ARRAY_ADD("array_add"), 45 | INNER_FUNCTION("inner_function"), 46 | INNER_FUNCTION_NO_ARGS("inner_function_no_args"), 47 | SLICE("slice"), 48 | SIZE("size"), 49 | RUN_FUNCTION("run_function"), 50 | OBJECT_INNER("object_inner"), 51 | NUMBER_SUGAR("number_sugar"),//取余数时,对于数字的隐性强转 52 | STRING_APPEND("string_append"), 53 | ARRAY_GET("array_get"), 54 | 55 | ARRAY_TYPE("array_type"), 56 | INT_TYPE("int_type"), 57 | STRING_TYPE("string_type"), 58 | BOOL_TYPE("bool_type"), 59 | DOUBLE_TYPE("double_type"), 60 | VAR_TYPE("var_type"), 61 | OBJECT_TYPE("object_type"), 62 | 63 | FUNCTION_ARG_DEFINE("function_arg_define"), 64 | 65 | NULL("null"), 66 | 67 | DEFINE_ARRAY("define_array"), 68 | 69 | DEFINE_INT("define_int"), 70 | 71 | DEFINE_STRING("define_string"), 72 | 73 | IMPORT_WITH("import_with"), 74 | 75 | NOT("not"), 76 | 77 | REQUIRE_SCRIPT("require script"), 78 | 79 | CONTINUE("continue"), 80 | 81 | ELSE_IF("else_if"), 82 | 83 | CONCAT("concat"), 84 | TRY("try"), 85 | THROW("throw"), 86 | CATCH("catch"), 87 | EXCEPTION_IF("exception_if"), 88 | CATCH_END("catch_end"), 89 | SHELL_VAR("shell_var"), 90 | DEFINE_OBJECT("define_object"), 91 | DELETE("delete"), 92 | DEFINE("define"), 93 | GIVE_FUNCTION("give_function"), 94 | DEFINE_GIVE_FUNCTION("def_give"); 95 | 96 | 97 | 98 | private String type; 99 | 100 | Syntax(String type){ 101 | this.type = type; 102 | } 103 | 104 | public String getType() { 105 | return type; 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/log/ServerLogger.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.log; 2 | 3 | 4 | import org.fusesource.jansi.Ansi; 5 | 6 | import java.io.File; 7 | 8 | /** 9 | * 服务端通用log, 10 | */ 11 | public class ServerLogger implements ILogger{ 12 | 13 | private File parentDir; 14 | 15 | private String prefix; 16 | 17 | 18 | public ServerLogger(File parentDir,String prefix){ 19 | this.prefix = prefix; 20 | this.parentDir = parentDir; 21 | } 22 | 23 | public ServerLogger(File parentDir){ 24 | this(parentDir,""); 25 | } 26 | 27 | @Override 28 | public void emergency(String message) { 29 | emergency(message,null); 30 | } 31 | 32 | @Override 33 | public void alert(String message) { 34 | alert(message,null); 35 | } 36 | 37 | @Override 38 | public void critical(String message) { 39 | critical(message,null); 40 | } 41 | 42 | @Override 43 | public void error(String message) { 44 | error(message,null); 45 | } 46 | 47 | @Override 48 | public void warning(String message) { 49 | warning(message,null); 50 | } 51 | 52 | @Override 53 | public void notice(String message) { 54 | notice(message,null); 55 | } 56 | 57 | @Override 58 | public void info(String message) { 59 | info(message,null); 60 | } 61 | 62 | @Override 63 | public void debug(String message) { 64 | debug(message,null); 65 | } 66 | 67 | @Override 68 | public void log(LogLevel level, String message) { 69 | log(level,message,null); 70 | } 71 | 72 | @Override 73 | public void emergency(String message, Throwable t) { 74 | LoggerUtil.printRedLog(prefix,message,"EMERGENCY",parentDir,this,t); 75 | } 76 | 77 | @Override 78 | public void alert(String message, Throwable t) { 79 | LoggerUtil.printRedLog(prefix,message,"ALERT",parentDir,this,t); 80 | } 81 | 82 | @Override 83 | public void critical(String message, Throwable t) { 84 | LoggerUtil.printRedLog(prefix,message,"CRITICAL",parentDir,this,t); 85 | } 86 | 87 | @Override 88 | public void error(String message, Throwable t) { 89 | LoggerUtil.printRedLog(prefix,message,"ERROR",parentDir,this,t); 90 | } 91 | 92 | @Override 93 | public void warning(String message, Throwable t) { 94 | LoggerUtil.printRedLog(prefix,message,"WARNING",parentDir,this,t); 95 | } 96 | 97 | @Override 98 | public void notice(String message, Throwable t) { 99 | LoggerUtil.printCommonLog(prefix,message,"NOTICE", Ansi.Color.YELLOW,parentDir,this,t); 100 | } 101 | 102 | @Override 103 | public void info(String message, Throwable t) { 104 | LoggerUtil.printCommonLog(prefix,message,"INFO", Ansi.Color.GREEN,parentDir,this,t); 105 | } 106 | 107 | @Override 108 | public void debug(String message, Throwable t) { 109 | LoggerUtil.printCommonLog(prefix,message,"DEBUG", Ansi.Color.YELLOW,parentDir,this,t); 110 | } 111 | 112 | @Override 113 | public void log(LogLevel level, String message, Throwable t) { 114 | level.getFunc().accept(new Message(message,t),this); 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/streams/MathCompileStream.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.streams; 2 | 3 | import cn.wenyan.compiler.CompileResult; 4 | import cn.wenyan.compiler.WenYanCompilerImpl; 5 | import cn.wenyan.compiler.WenYanLib; 6 | import cn.wenyan.compiler.script.libs.Language; 7 | import cn.wenyan.compiler.script.libs.LanguageUtils; 8 | import cn.wenyan.compiler.script.libs.Syntax; 9 | import cn.wenyan.compiler.utils.Utils; 10 | 11 | 12 | import java.util.List; 13 | 14 | public class MathCompileStream extends CompileStream { 15 | 16 | 17 | public MathCompileStream(WenYanCompilerImpl compiler) { 18 | super(compiler); 19 | } 20 | 21 | @Override 22 | public CompileResult compile(List wenyan) { 23 | 24 | VariableCompileStream stream = compiler.getStream(VariableCompileStream.class); 25 | if(Utils.matches(wenyan, WenYanLib.MATH_START())){ 26 | String value01 = compiler.removeWenyan();//0 27 | String symbol = language.getSyntax(WenYanLib.math().get(value01.charAt(0)).get()); 28 | String num = value01.substring(value01.indexOf(value01.charAt(0))+1); 29 | String number1 = Utils.getValue(num,stream); 30 | if(Utils.matches(wenyan,WenYanLib.VAL())) { 31 | String value02 = compiler.removeWenyan();//1 32 | String number2 = Utils.getValue(value02.substring(value02.indexOf(value02.charAt(0))+1), stream); 33 | if (symbol.equals(language.getSyntax(Syntax.MATH_EXCEPT))) { 34 | if (Utils.matches(wenyan, WenYanLib.MOD())) { 35 | compiler.removeWenyan(); 36 | symbol = language.getSyntax(Syntax.MATH_REMAIN); 37 | } 38 | } 39 | String name = stream.getAnsName(); 40 | 41 | String result; 42 | 43 | if (value02.charAt(0) == '以') { 44 | if(symbol.equals(language.getSyntax(Syntax.MATH_REMAIN))){ 45 | number1 = LanguageUtils.numberSugar(language,number1); 46 | } 47 | result = LanguageUtils.defineVar(language,name,symbol.replace(Language.getNAME(),number1).replace(Language.getVALUE(),number2)); 48 | } else { 49 | result = LanguageUtils.defineVar(language,name,symbol.replace(Language.getNAME(),number2).replace(Language.getVALUE(),number1)); 50 | } 51 | 52 | return new CompileResult(result); 53 | } 54 | } 55 | if(Utils.matches(wenyan,WenYanLib.AND_OR())){ 56 | String value = compiler.removeWenyan(); 57 | String method = Utils.getString(WenYanLib.AND_OR(),value); 58 | List strings = Utils.getStrings(WenYanLib.VAR_NAME_FOR(),value); 59 | if("有陽".equals(method)){ 60 | return new CompileResult(LanguageUtils.defineVar(language,stream.getAnsName(),Utils.getValue(strings.get(0),stream)+language.getSyntax(Syntax.OR)+Utils.getValue(strings.get(1),stream))); 61 | }else if("無陰".equals(method)){ 62 | return new CompileResult(LanguageUtils.defineVar(language,stream.getAnsName(),Utils.getValue(strings.get(0),stream)+language.getSyntax(Syntax.AND)+Utils.getValue(strings.get(1),stream))); 63 | } 64 | } 65 | return new CompileResult(false,wenyan); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at . All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/command/CompilerConfig.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.command; 2 | 3 | public class CompilerConfig { 4 | 5 | private boolean strongType; 6 | 7 | private boolean lexerViewer; 8 | 9 | private String wygDownload; 10 | 11 | private String wenyuangeFile; 12 | 13 | private boolean groovy = true; 14 | 15 | private String classFile; 16 | 17 | private String mainClass; 18 | 19 | private boolean supportPinYin;// 20 | 21 | private String[] compileFiles;// 22 | 23 | private String[] compileLib;// 24 | 25 | private String outFile;// 26 | 27 | private boolean run;// 28 | 29 | private String sourcePath; 30 | 31 | private String[] runArgs = new String[0]; 32 | 33 | public boolean isStrongType() { 34 | return strongType; 35 | } 36 | 37 | public void setStrongType(boolean strongType) { 38 | this.strongType = strongType; 39 | } 40 | 41 | public boolean isSupportPinYin() { 42 | return supportPinYin; 43 | } 44 | 45 | public String getSourcePath() { 46 | return sourcePath; 47 | } 48 | 49 | public void setSourcePath(String sourcePath) { 50 | this.sourcePath = sourcePath; 51 | } 52 | 53 | public void setSupportPinYin(boolean supportPinYin) { 54 | this.supportPinYin = supportPinYin; 55 | } 56 | 57 | public String[] getCompileFiles() { 58 | return compileFiles; 59 | } 60 | 61 | public void setCompileFiles(String... compileFiles) { 62 | this.compileFiles = compileFiles; 63 | } 64 | 65 | public String[] getCompileLib() { 66 | return compileLib; 67 | } 68 | 69 | public void setCompileLib(String... compileLib) { 70 | this.compileLib = compileLib; 71 | } 72 | 73 | public boolean isRun() { 74 | return run; 75 | } 76 | 77 | public void setRun(boolean run) { 78 | this.run = run; 79 | } 80 | 81 | public String[] getRunArgs() { 82 | return runArgs; 83 | } 84 | 85 | public void setRunArgs(String... runArgs) { 86 | this.runArgs = runArgs; 87 | } 88 | 89 | public String getOutFile() { 90 | return outFile; 91 | } 92 | 93 | public void setOutFile(String outFile) { 94 | this.outFile = outFile; 95 | } 96 | 97 | public String getMainClass() { 98 | return mainClass; 99 | } 100 | 101 | public void setMainClass(String mainClass) { 102 | this.mainClass = mainClass; 103 | } 104 | 105 | public boolean isGroovy() { 106 | return groovy; 107 | } 108 | 109 | public void setGroovy(boolean groovy) { 110 | this.groovy = groovy; 111 | } 112 | 113 | public void setClassFile(String classFile) { 114 | this.classFile = classFile; 115 | } 116 | 117 | public String getClassFile() { 118 | return classFile; 119 | } 120 | 121 | public void setWenyuangeFile(String wenyuangeFile) { 122 | this.wenyuangeFile = wenyuangeFile; 123 | } 124 | 125 | public String getWenyuangeFile() { 126 | return wenyuangeFile; 127 | } 128 | 129 | public void setWygDownload(String wygDownload) { 130 | this.wygDownload = wygDownload; 131 | } 132 | 133 | public String getWygDownload() { 134 | return wygDownload; 135 | } 136 | 137 | public boolean isLexerViewer() { 138 | return lexerViewer; 139 | } 140 | 141 | public void setLexerViewer(boolean lexerViewer) { 142 | this.lexerViewer = lexerViewer; 143 | } 144 | } 145 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/streams/TryCompileStream.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.streams; 2 | 3 | import cn.wenyan.compiler.CompileResult; 4 | import cn.wenyan.compiler.WenYanCompilerImpl; 5 | import cn.wenyan.compiler.WenYanLib; 6 | import cn.wenyan.compiler.script.libs.Language; 7 | import cn.wenyan.compiler.script.libs.LanguageUtils; 8 | import cn.wenyan.compiler.script.libs.Syntax; 9 | import cn.wenyan.compiler.utils.Utils; 10 | 11 | import java.util.List; 12 | 13 | public class TryCompileStream extends CompileStream{ 14 | 15 | private String nowException; 16 | 17 | private int index = 0; 18 | 19 | private boolean isStartElse = false; 20 | 21 | public TryCompileStream(WenYanCompilerImpl compiler) { 22 | super(compiler); 23 | } 24 | 25 | @Override 26 | public CompileResult compile(List wenyan) { 27 | VariableCompileStream stream = compiler.getStream(VariableCompileStream.class); 28 | if(Utils.matches(wenyan, WenYanLib.TRY())){ 29 | compiler.removeWenyan(); 30 | return new CompileResult(language.getSyntax(Syntax.TRY)); 31 | } 32 | if(Utils.matches(wenyan,WenYanLib.EXCEPTION_DEFINE())){ 33 | compiler.removeWenyan(); 34 | if(Utils.matches(wenyan,WenYanLib.EXCEPTION_THROW())){ 35 | String value = compiler.removeWenyan(); 36 | String name = Utils.getValue(Utils.getString(WenYanLib.STRING(),value),stream); 37 | return new CompileResult(LanguageUtils.throwEx(language,stream.getAnsName(),name)); 38 | } 39 | } 40 | if(Utils.matches(wenyan,WenYanLib.CATCH())){ 41 | compiler.removeWenyan(); 42 | String name = stream.getAnsName(); 43 | nowException = name; 44 | String end = ""; 45 | if(Utils.matches(wenyan,WenYanLib.CATCH_END())){ 46 | compiler.removeWenyan(); 47 | end = "}"; 48 | } 49 | if(Utils.matches(wenyan,WenYanLib.EXCEPTION_ELSE())){ 50 | compiler.removeWenyan(); 51 | isStartElse = true; 52 | } 53 | return new CompileResult(LanguageUtils.catchEx(language,name)+end); 54 | } 55 | if(Utils.matches(wenyan,WenYanLib.EXCEPTION_IF())){ 56 | String name = compiler.removeWenyan(); 57 | name = Utils.getValue(Utils.getString(WenYanLib.STRING(),name),stream); 58 | if(index == 0){ 59 | index++; 60 | return new CompileResult(LanguageUtils.defineIf(language, LanguageUtils.ifEquals(language,nowException,name))); 61 | }else{ 62 | index++; 63 | return new CompileResult(language.getSyntax(Syntax.ELSE_IF)+LanguageUtils.defineIf(language, LanguageUtils.ifEquals(language,nowException,name))); 64 | } 65 | } 66 | if(Utils.matches(wenyan,WenYanLib.EXCEPTION_ELSE())){ 67 | //不知何禍歟。 68 | compiler.removeWenyan(); 69 | return new CompileResult(language.getSyntax(Syntax.ELSE)+"\n"+LanguageUtils.defineVar(language,stream.getAnsName(),nowException)); 70 | } 71 | if(Utils.matches(wenyan,WenYanLib.CATCH_END())){ 72 | compiler.removeWenyan(); 73 | index = 0; 74 | if(isStartElse) { 75 | isStartElse = false; 76 | return new CompileResult(language.getSyntax(Syntax.CATCH_END)); 77 | }else{ 78 | return new CompileResult(language.getSyntax(Syntax.CATCH_END)+"\n"+language.getSyntax(Syntax.CATCH_END)); 79 | } 80 | } 81 | 82 | return new CompileResult(false,wenyan); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/WenYanShell.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler; 2 | 3 | import cn.wenyan.compiler.log.ServerLogger; 4 | import cn.wenyan.compiler.script.libs.Language; 5 | import cn.wenyan.compiler.script.libs.LanguageUtils; 6 | import cn.wenyan.compiler.script.libs.Syntax; 7 | import cn.wenyan.compiler.utils.LexerUtils; 8 | import groovy.lang.GroovyShell; 9 | import org.codehaus.groovy.tools.shell.Groovysh; 10 | import scala.tools.nsc.interpreter.jline.JlineReader; 11 | 12 | import static cn.wenyan.compiler.utils.Utils.getClose; 13 | 14 | 15 | public class WenYanShell implements RunCode { 16 | 17 | private Groovysh shell; 18 | 19 | private WenYanCompilerImpl compiler; 20 | 21 | private GroovyShell run; 22 | 23 | 24 | public WenYanShell(){ 25 | this.compiler = new WenYanCompilerImpl(false,Language.GROOVY,this); 26 | this.shell = new Groovysh(); 27 | this.run = new GroovyShell(); 28 | //compiler.getStream(FunctionCompileStream.class).setShell(true); 29 | LanguageUtils.setShell(true); 30 | } 31 | 32 | public WenYanShell(WenYanCompilerImpl compiler){ 33 | this.compiler = compiler; 34 | this.run = new GroovyShell(); 35 | } 36 | 37 | public void run(String wenyan){ 38 | shell.execute(wenyan); 39 | } 40 | 41 | public synchronized Object run(boolean out,String... wenyanString){ 42 | compiler.getServerLogger().info("---------------运行之--------------------"); 43 | String code = compiler.getGroovyCode(true,out, wenyanString); 44 | //System.out.println(code); 45 | return run.evaluate(code); 46 | 47 | } 48 | 49 | public GroovyShell getRun() { 50 | return run; 51 | } 52 | 53 | // 1. groovyShell 54 | // 2. 导入(import)和包管理 55 | // 导入文言脚本文件或者类 56 | // 通过判断,若不存在类,则通过引入文件形式导入 57 | // 3. 编译为字节码文件 58 | public static void main(String[] args) { 59 | run(); 60 | } 61 | 62 | public static void run(){ 63 | int index = 0; 64 | int line = 0; 65 | JlineReader reader = new JlineReader(true,true); 66 | WenYanShell shell = new WenYanShell(); 67 | ServerLogger logger = shell.compiler.getServerLogger(); 68 | logger.info("WenYan Lang - Shell: @CopyRight wy-lang.org v 1.0"); 69 | String[] imports = shell.compiler.getLanguageType().getSyntax(Syntax.IMPORT_WITH).split("\n"); 70 | for(String s : imports) 71 | shell.run(s); 72 | String prefix = ">"; 73 | StringBuilder builder = new StringBuilder(); 74 | while (true){ 75 | String code = reader.readLine(prefix); 76 | if(code.matches("(:)[a-zA-Z?\\\\.]+")){ 77 | shell.run(code); 78 | continue; 79 | } 80 | String returned = shell.compiler.compile(code,false); 81 | if(LexerUtils.trimWenYanX(returned).startsWith("import")){ 82 | String[] imps = returned.split("\n"); 83 | for(String imp : imps){ 84 | shell.run(imp); 85 | } 86 | continue; 87 | } 88 | index += getClose(returned); 89 | if(index == 0) { 90 | builder.append(returned).append("\n"); 91 | try { 92 | shell.run(builder.toString()); 93 | }catch (Exception e){ 94 | shell.compiler.getServerLogger().error(e.getMessage()); 95 | } 96 | 97 | builder = new StringBuilder(); 98 | prefix = ">"; 99 | line = 0; 100 | }else{ 101 | builder.append(returned); 102 | prefix = "... "+line; 103 | } 104 | line++; 105 | } 106 | } 107 | 108 | 109 | 110 | 111 | } 112 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/log/LoggerUtil.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.log; 2 | 3 | import org.apache.commons.io.FileUtils; 4 | import org.fusesource.jansi.Ansi; 5 | 6 | import java.io.File; 7 | import java.io.IOException; 8 | import java.time.LocalDateTime; 9 | import java.time.format.DateTimeFormatter; 10 | import java.util.List; 11 | 12 | 13 | public class LoggerUtil { 14 | 15 | public static Object println(Object message){ 16 | System.out.println(message); 17 | return message; 18 | } 19 | 20 | //log文件的格式 2019-12-21-12.log 21 | public static void fileDatePrintln(Object message, File parentDir) throws IOException { 22 | String name = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE)+"-"+LocalDateTime.now().getHour()+".log"; 23 | if(!parentDir.exists())parentDir.mkdirs(); 24 | File file = new File(parentDir,name); 25 | if(!file.exists()){ 26 | if(!file.createNewFile())return; 27 | } 28 | String encoding = System.getProperty("file.encoding"); 29 | List lines = FileUtils.readLines(file,encoding); 30 | Thread thread = Thread.currentThread(); 31 | lines.add(new StringBuilder() 32 | .append("[") 33 | .append("Thread") 34 | .append(" ") 35 | .append(thread.getName()) 36 | .append("-") 37 | .append(thread.getId()) 38 | .append("]") 39 | .append(message.toString() 40 | .replaceAll("\\033\\[[0-9]+m","")).toString()); 41 | FileUtils.writeLines(file,encoding,lines); 42 | } 43 | 44 | public static StackTraceElement getStackTraceElement(){ 45 | StackTraceElement[] elements = new Throwable().getStackTrace(); 46 | StackTraceElement element = elements[elements.length-1]; 47 | int index = elements.length-1; 48 | while (element.getClassName().startsWith("java")){ 49 | element = elements[index--]; 50 | } 51 | return element; 52 | } 53 | 54 | 55 | public static String simpleClassName(String className){ 56 | String[] fields = className.split("\\."); 57 | StringBuilder builder = new StringBuilder(); 58 | for(int i = 0;i wenyan) { 28 | VariableCompileStream stream = compiler.getStream(VariableCompileStream.class); 29 | if(Utils.matches(wenyan, WenYanLib.FOR())){ 30 | String value = compiler.removeWenyan(); 31 | String str = Utils.getString(WenYanLib.FOR(),value); 32 | if(str != null) { 33 | str = stream.getNumberString(str)+""; 34 | }else{ 35 | String var = Utils.getString(WenYanLib.VAR_NAME_FOR(),value); 36 | str = stream.getName(var,false); 37 | 38 | } 39 | index++; 40 | close++; 41 | return new CompileResult(LanguageUtils.forNumber(language,index+"",str)); 42 | } 43 | if(Utils.matches(wenyan,WenYanLib.FOR_END())){ 44 | close -- ; 45 | compiler.removeWenyan(); 46 | return new CompileResult(language.getSyntax(Syntax.FOR_END)); 47 | } 48 | if(Utils.matches(wenyan,WenYanLib.IF_END())){ 49 | close --; 50 | compiler.removeWenyan(); 51 | return new CompileResult(language.getSyntax(Syntax.IF_END)); 52 | } 53 | if(Utils.matches(wenyan,WenYanLib.IF_START())){ 54 | close++; 55 | String value = compiler.removeWenyan(); 56 | String bool = getBooleanSyntax(value.substring(value.indexOf("若")+1,value.lastIndexOf("者")),stream); 57 | return new CompileResult(LanguageUtils.defineIf(language,bool)); 58 | } 59 | if(Utils.matches(wenyan,WenYanLib.IF_BREAK())){ 60 | close++; 61 | String value = compiler.removeWenyan(); 62 | String bool = getBooleanSyntax(value.substring(value.indexOf("若")+1,value.lastIndexOf("者")),stream); 63 | return new CompileResult(LanguageUtils.ifBreak(language,bool)); 64 | } 65 | if(Utils.matches(wenyan,WenYanLib.WHILE())){ 66 | close++; 67 | compiler.removeWenyan(); 68 | return new CompileResult(language.getSyntax(Syntax.WHILE_TRUE)); 69 | } 70 | if(Utils.matches(wenyan,WenYanLib.ELSE())){ 71 | close++; 72 | compiler.removeWenyan(); 73 | return new CompileResult(language.getSyntax(Syntax.ELSE)); 74 | } 75 | if(Utils.matches(wenyan,WenYanLib.BREAK())){ 76 | compiler.removeWenyan(); 77 | return new CompileResult(language.getSyntax(Syntax.BREAK)); 78 | } 79 | if(Utils.matches(wenyan,WenYanLib.FOR_EACH())){ 80 | String value = compiler.removeWenyan(); 81 | close++; 82 | List names = Utils.getStrings(WenYanLib.VAR_NAME_FOR(),value); 83 | 84 | return new CompileResult(LanguageUtils.forEach(language,stream.getName(names.get(1),false),stream.getName(names.get(0),false))); 85 | } 86 | if(Utils.matches(wenyan,WenYanLib.CONTINUE())){ 87 | compiler.removeWenyan(); 88 | return new CompileResult(language.getSyntax(Syntax.CONTINUE)); 89 | } 90 | if(Utils.matches(wenyan,WenYanLib.ELSE_IF())){ 91 | compiler.removeWenyan(); 92 | if(Utils.matches(wenyan,WenYanLib.MACRO_BEFORE())){ 93 | compiler.removeWenyan(); 94 | return new CompileResult(""); 95 | } 96 | return new CompileResult(language.getSyntax(Syntax.ELSE_IF)); 97 | } 98 | return new CompileResult(false,wenyan); 99 | } 100 | 101 | private String getBooleanSyntax(String wenYan,VariableCompileStream stream){ 102 | if(wenYan.contains(WenYanLib.NOT_BIG_THAN())){ 103 | return getBool(WenYanLib.NOT_BIG_THAN(),wenYan); 104 | }else if(wenYan.contains(WenYanLib.BIG_THAN())){ 105 | return getBool(WenYanLib.BIG_THAN(),wenYan); 106 | }else if(wenYan.contains(WenYanLib.NOT_SMALL_THAN())){ 107 | return getBool(WenYanLib.NOT_SMALL_THAN(),wenYan); 108 | }else if(wenYan.contains(WenYanLib.SMALL_THAN())){ 109 | return getBool(WenYanLib.SMALL_THAN(),wenYan); 110 | }else if(wenYan.contains(WenYanLib.NOT_EQUALS())){ 111 | return getBool(WenYanLib.NOT_EQUALS(),wenYan); 112 | }else if(wenYan.contains(WenYanLib.EQUALS())){ 113 | return getBool(WenYanLib.EQUALS(),wenYan); 114 | }else{ 115 | return getValue(wenYan,stream); 116 | } 117 | } 118 | 119 | public String getBool(String type,String wenYan){ 120 | String[] numbers = wenYan.split(type); 121 | if(numbers.length != 2)throw new SyntaxException("此表达式之过也: "+wenYan); 122 | VariableCompileStream stream = compiler.getStream(VariableCompileStream.class); 123 | return new StringBuilder().append(getValue(numbers[0],stream)) 124 | .append(language.getSyntax(WenYanLib.bool().get(type).get())) 125 | .append(getValue(numbers[1],stream)).toString(); 126 | } 127 | 128 | 129 | 130 | } 131 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/lang/曆表.wy: -------------------------------------------------------------------------------- 1 | 注曰「「此文程式之作文也。勿施以修訂。」」 2 | 注曰「「程式書於文 tools/make_calendar.js 」」 3 | 4 | 今有一數。曰五七一〇五。名之曰「始曆月」。 5 | 今有一列。名之曰「曆月表」。 6 | 今有一數。曰一七〇一。名之曰「始閏月」。 7 | 今有一列。名之曰「閏月表」。 8 | 9 | 充「曆月表」。 10 | 以一以一以一以一以〇以一以〇以〇以〇以負一以〇以〇以一以一以一。 11 | 以一以一以〇以一以〇以〇以〇以〇以〇以一以一以〇以一以一以一以〇以一以〇以〇以〇。 12 | 以〇以〇以一以〇以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以〇以一以〇以一。 13 | 以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以一。 14 | 以〇以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇。 15 | 以〇以〇以一以一以一以一以一以〇以一以〇以〇以〇以負一以〇以〇以一以一以一以一以一。 16 | 以〇以一以〇以〇以〇以〇以〇以一以一以〇以一以一以一以〇以一以〇以〇以〇以〇以〇。 17 | 以一以〇以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一。 18 | 以一以〇以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以一以一以〇以〇以〇。 19 | 以〇以〇以〇以一以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以一以〇。 20 | 以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以一以一以一以一以一以〇以一。 21 | 以〇以〇以〇以〇以〇以一以一以〇以一以一以一以〇以一以〇以〇以〇以〇以〇以一以〇。 22 | 以一以一以二以一以〇以一以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇。 23 | 以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇。 24 | 以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以〇以〇以〇以一以〇以一以〇。 25 | 以一以〇以一以〇以一以〇以一以〇以〇以〇以〇以一以〇以一以一以一以〇以一以〇以〇。 26 | 以〇以〇以〇以一以一以〇以一以一以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一。 27 | 以二以一以〇以一以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以〇以〇。 28 | 以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以一。 29 | 以〇以一以一以一以〇以一以〇以一以〇以一以〇以〇以一以〇以一以〇以一以〇以一以〇。 30 | 以一以〇以一以〇以一以〇以〇以〇以〇以一以〇以一以〇以一以〇以一以〇以〇以〇以一。 31 | 以〇以一以一以〇以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一。 32 | 以〇以一以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以〇以〇以〇以〇。 33 | 以〇以〇以一以一以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以一以一以一。 34 | 以一以一以〇以一以〇以一以〇以一以〇以〇以一以〇以一以〇以一以〇以一以〇以一以〇。 35 | 以一以〇以一以〇以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一。 36 | 以一以〇以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以〇以一。 37 | 以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以〇。 38 | 以一以一以一以一以一以一以一以〇以一以〇以負一以〇以〇以〇以〇以一以一以一以一以一。 39 | 以〇以一以〇以〇以〇以一以〇以〇以一以〇以一以一以一以〇以一以〇以一以〇以一以〇。 40 | 以一以〇以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以一以〇。 41 | 以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以〇以一以〇以〇。 42 | 以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以〇以一以〇。 43 | 以一以一以一以一以一以〇以一以〇以負一以〇以〇以〇以〇以一以一以一以一以一以〇以一。 44 | 以〇以〇以〇以一以〇以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一。 45 | 以一以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以〇以一以〇。 46 | 以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以一以〇以一以〇以〇以〇以〇。 47 | 以〇以一以〇以一以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以一以〇以一以一。 48 | 以一以一以一以〇以一以〇以負一以〇以〇以〇以〇以一以一以一以一以一以〇以一以〇以〇。 49 | 以〇以〇以〇以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一。 50 | 以一以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以〇以一以〇以〇以〇。 51 | 以〇以〇以〇以〇以一以〇以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以〇以一。 52 | 以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一。 53 | 以一以〇以一以〇以〇以〇以〇以〇以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇。 54 | 以〇以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以一以一。 55 | 以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以〇以一以〇以〇以〇以〇以〇。 56 | 以〇以〇以一以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以一以〇以一以〇以一。 57 | 以一以一以〇以一以〇以一以〇以〇以〇以〇以一以〇以一以〇以一以一以一以〇以一以〇。 58 | 以一以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以一以〇以〇。 59 | 以一以〇以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以一。 60 | 以〇以〇以〇以〇以〇以一以〇以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以〇。 61 | 以一以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一。 62 | 以〇以一以〇以一以〇以〇以〇以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇。 63 | 以〇以〇以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以〇以一以〇。 64 | 以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以一以〇以〇。 65 | 以〇以〇以〇以一以〇以一以一以二以一以〇以一以〇以〇以〇以〇以〇以〇以〇以一以一。 66 | 以一以一以一以一以一以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一。 67 | 以〇以一以〇以〇以〇以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以〇以〇。 68 | 以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以〇以一以〇以一以〇。 69 | 以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以〇以一以〇以一以〇以〇以〇以〇。 70 | 以〇以一以〇以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以〇以一以一以一以一。 71 | 以一以一以一以〇以〇以〇以〇以〇以〇以一以一以一以一以一以一以一以〇以一以〇以〇。 72 | 以〇以〇以〇以〇以一以一以一以一以一以〇以一以〇以一以〇以一以〇以〇以一以〇以一。 73 | 以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以一以〇以一以〇以一以〇以一以〇。 74 | 以一以〇以〇以〇以一以〇以一以一以一以一以〇以一以〇以一以〇以〇以〇以〇以〇以一。 75 | 以〇以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一以一。 76 | 以一以〇以〇以〇以負一以〇以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇。 77 | 以〇以〇以一以一以一以一以一以〇以一以〇以〇以〇以一以〇以〇以一以〇以一以〇以一。 78 | 以〇以一以〇以〇以〇以一以〇以一以〇以一以一以〇以一以〇以一以〇以一以〇以〇以〇。 79 | 以一以〇以一以〇以一以一以一以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以〇以一。 80 | 以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一以一以一以〇。 81 | 以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇。 82 | 以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以一以一以一以一以一以〇以一。 83 | 以〇以〇以〇以〇以〇以一以一以一以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以〇。 84 | 以一以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以〇以一以一以一。 85 | 以一以〇以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以一以一以〇以〇以〇。 86 | 以〇以〇以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以一以一。 87 | 以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以一以〇以〇。 88 | 以〇以〇以〇以一以一以一以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一。 89 | 以一以一以一以一以〇以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一。 90 | 以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇。 91 | 以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以一以一以一以一。 92 | 以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以一以〇以〇以〇以〇。 93 | 以〇以一以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一。 94 | 以一以一以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一以一以一以〇以一以〇以〇。 95 | 以〇以〇以一以〇以一以〇以一以一以一以〇以一以〇以一以〇以〇以〇以〇以〇以〇以一。 96 | 以〇以一以一以一以〇以一以〇以一以〇以一以〇以〇以〇以〇以一以一以一以一以一以〇。 97 | 以一以〇以〇以〇以〇以〇以一以一以〇以一以一以一以〇以一以〇以〇以〇以〇以〇以一。 98 | 以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以一。 99 | 以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一以一以一以〇以一以〇以〇以〇以〇。 100 | 以一以〇以一以一以一以一以一以〇以一以〇以一以〇以〇以〇以〇以一以〇以一以〇以一。 101 | 以〇以一以〇以一以〇以一以〇以一以〇以〇以一以〇以一以〇以一以〇以一以〇以一以〇。 102 | 以〇以〇以一以〇以一以一以〇以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以一以一。 103 | 以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以一以〇以〇。 104 | 以〇以〇以〇以〇以〇以一以一以一以一以一以一以一以〇以一以〇以〇以〇以〇以一以〇。 105 | 以一以一以一以一以一以〇以一以〇以一以〇以〇以〇以〇以一以〇以一以〇以一以〇以一。 106 | 以〇以一以〇以一以〇以一以〇以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇。 107 | 以一以〇以一以一以〇以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以〇。 108 | 以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以一以〇以〇以〇以〇。 109 | 以〇以〇以〇以一以一以一以一以一以一以一以〇以一以〇以負一以〇以〇以一以〇以一以一。 110 | 以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以一以一以一以〇以一以〇以一以〇以〇。 111 | 以〇以一以〇以一以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以一。 112 | 以一以一以〇以一以〇以一以〇以一以〇以〇以〇以一以〇以一以一以一以一以〇以一以〇。 113 | 以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇。 114 | 以〇以一以一以一以一以一以一以一以〇以一以〇以負一以〇以〇以一以〇以一以一以一以一。 115 | 以一以〇以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一以〇以一以〇以〇以〇以一。 116 | 以〇以一以一以〇以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一。 117 | 以〇以一以〇以一以〇以〇以〇以一以〇以一以〇以一以一以一以一以〇以一以〇以〇以〇。 118 | 以〇以〇以〇以〇以一以〇以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以〇以一。 119 | 以一以一以一以一以一以一以〇以一以〇以負一以〇以〇以一以〇以一以一以一以一以一以〇。 120 | 以一以〇以〇以〇以〇以〇以〇以一以一以一以一以一以〇以〇以〇以〇以〇以〇以〇以一。 121 | 以一以〇以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以一。 122 | 以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以〇。 123 | 以一以〇以一以〇以一以一以一以一以一以〇以〇以〇以〇以〇以〇以〇以〇以一以一以一。 124 | 以一以一以一以一以〇以一以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一以〇。 125 | 以〇以〇以〇以〇以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一以一。 126 | 以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以一以〇以〇。 127 | 以〇以〇以〇以一以〇以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以〇以一以〇。 128 | 以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以一以〇以一以〇以一以一以一。 129 | 以〇以一以〇以一以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇。 130 | 以一以〇以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一以〇以一以一。 131 | 以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以一以〇以〇以〇以〇。 132 | 以〇以一以〇以一以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以一以〇以一以一。 133 | 以一以一以一以〇以一以〇以〇以〇以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一。 134 | 以〇以一以〇以〇以〇以〇以一以〇以一以〇以一。 135 | 136 | 充「閏月表」。 137 | 以負三以負一以一以二以負二以〇以二以負三以〇以一以二以負一以〇以二以負二以負一以一以三以負一。 138 | 以〇以三以負二以負一以一以負二以負二以〇以一以負二以負二以一以二以負一以〇以二以負一以負一以一以二。 139 | 以負三以〇以一以一以負一以一以二以負二以〇以一以負二以負一以〇以三以負二以〇以二以負三以負一以〇。 140 | 以三以負二以〇以二以負三以負一以〇以二以負二以負一以二以負二以負一以〇以三以負二。 -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/utils/GroovyUtils.groovy: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.utils 2 | 3 | import cn.wenyan.compiler.WenYanLib 4 | import groovy.transform.CompileStatic 5 | 6 | @CompileStatic 7 | class GroovyUtils { 8 | 9 | private static List number = [10,100,1000] 10 | 11 | static List splitGroovyCode(String code,String chars){ 12 | int index = 0 13 | def arr = [] 14 | StringBuilder builder = new StringBuilder() 15 | boolean start = false 16 | for(int i = 0;imax){ 131 | max = number 132 | maxIndex = index 133 | } 134 | } 135 | } 136 | if(number.contains(max))return -1 137 | return maxIndex 138 | } 139 | 140 | static String replace(String before,String replaced,String after,List range){ 141 | int close = 0 142 | StringBuilder afterBuilder = new StringBuilder() 143 | StringBuilder now = new StringBuilder() 144 | int afterStart = 0 145 | for(s in before){ 146 | if(s == range[0]){ 147 | close ++ 148 | } 149 | if(s == range[1]){ 150 | close -- 151 | } 152 | now.append(s) 153 | if(s == replaced[afterStart]){ 154 | afterStart++ 155 | }else{ 156 | afterStart = 0 157 | afterBuilder.append(now) 158 | now = new StringBuilder() 159 | } 160 | if(afterStart == replaced.size()){ 161 | if(close == 0){ 162 | afterBuilder.append(after) 163 | }else{ 164 | afterBuilder.append(now) 165 | } 166 | afterStart = 0 167 | now = new StringBuilder() 168 | } 169 | } 170 | return afterBuilder 171 | } 172 | 173 | static String replaceWithOutString(String before,String replaced,String after){ 174 | replace(before,replaced,after,["「","」"]) 175 | } 176 | 177 | } 178 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/WenyanToGroovyBackend.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler; 2 | 3 | import cn.wenyan.compiler.script.libs.Syntax; 4 | import cn.wenyan.compiler.utils.GroovyUtils; 5 | import cn.wenyan.compiler.utils.ResultEntry; 6 | import cn.wenyan.compiler.utils.Utils; 7 | import org.codehaus.groovy.control.CompilerConfiguration; 8 | import org.codehaus.groovy.tools.Compiler; 9 | 10 | import java.io.File; 11 | import java.io.FileNotFoundException; 12 | import java.io.PrintWriter; 13 | import java.util.ArrayList; 14 | import java.util.Iterator; 15 | import java.util.List; 16 | 17 | import static cn.wenyan.compiler.WenYanCompiler.ERROR; 18 | 19 | public class WenyanToGroovyBackend implements CompileBackend { 20 | 21 | private WenYanCompilerImpl compiler; 22 | 23 | public void init(WenYanCompilerImpl impl){ 24 | this.compiler = impl; 25 | } 26 | 27 | 28 | public void appendClassName(int index, String mainClass, String className, List codes, StringBuilder builder, String annotation, String pack){ 29 | if(codes.size()>=1&&codes.get(0).equals(ERROR)){ 30 | throw new RuntimeException("compile error"); 31 | } 32 | if(index !=-1){ 33 | builder.append("package "); 34 | builder.append(pack); 35 | } 36 | boolean isMain = mainClass.equals(className); 37 | String filter = "import"; 38 | ResultEntry codeEntry = getStaticCode(makeCodeStatic(codes,!isMain),isMain); 39 | String code = filterAndToString(codeEntry.getCode(),filter); 40 | String imports = getImports(codes); 41 | 42 | builder.append("\n"); 43 | builder.append(compiler.getLanguageType().getSyntax(Syntax.IMPORT_WITH)); 44 | builder.append("\n"); 45 | builder.append(imports); 46 | if(!isMain){ 47 | 48 | builder.append("\n"); 49 | builder.append(annotation); 50 | builder.append("class "); 51 | builder.append(className.replace(pack,"").replace(".","")); 52 | builder.append("{"); 53 | builder.append("\n"); 54 | } 55 | builder.append(code); 56 | if(!isMain) { 57 | builder.append("\nstatic{\n"); 58 | builder.append(codeEntry.getOutCode()); 59 | builder.append("}"); 60 | builder.append("\n}"); 61 | } 62 | } 63 | 64 | 65 | 66 | 67 | public void compileToClass(File out,File classFile) throws FileNotFoundException { 68 | CompilerConfiguration compilerConfiguration = new CompilerConfiguration(); 69 | PrintWriter writer = new PrintWriter(classFile); 70 | compilerConfiguration.setOutput(writer); 71 | compilerConfiguration.setTargetBytecode(CompilerConfiguration.JDK8); 72 | compilerConfiguration.setTargetDirectory(compiler.getClassPath()); 73 | compilerConfiguration.setClasspath(compiler.getClassPath()); 74 | Compiler compiler = new Compiler(compilerConfiguration); 75 | compiler.compile(out); 76 | writer.close(); 77 | } 78 | 79 | private String getImports(List results){ 80 | StringBuilder builder = new StringBuilder(); 81 | for(String r :results) { 82 | if(r!=null&&!r.startsWith("import"))continue; 83 | builder.append("\n").append(r); 84 | } 85 | return builder.toString(); 86 | } 87 | 88 | 89 | private ResultEntry getStaticCode(List results,boolean isMain){ 90 | if(isMain){ 91 | return new ResultEntry(results,""); 92 | } 93 | StringBuilder builder = new StringBuilder(); 94 | List rs = new ArrayList<>(results); 95 | int index = 0; 96 | for(int i = 0;i iterator = rs.iterator(); 118 | while (iterator.hasNext()){ 119 | if(iterator.next() == null)iterator.remove(); 120 | } 121 | return new ResultEntry(rs,builder.toString()); 122 | } 123 | 124 | 125 | 126 | private List makeCodeStatic(List results,boolean get){ 127 | if(get) { 128 | int index = 0; 129 | for (int i = 0; i < results.size(); i++) { 130 | if (index == 0) { 131 | String result = results.get(i); 132 | if (result.startsWith("def")||result.startsWith("class")){ 133 | StringBuilder builder = new StringBuilder(); 134 | String[] str = GroovyUtils.splitGroovyCode(result,"\n").toArray(new String[0]); 135 | for(int z = 0;z getStrings(String patternId, String... things) { 23 | List matchers = new ArrayList<>(); 24 | Pattern typePattern = WenYanLib.patterns().get(patternId).get(); 25 | for (String thing : things) { 26 | Matcher typeMatcher = typePattern.matcher(thing); 27 | while (typeMatcher.find()) { 28 | matchers.add(typeMatcher.group(0)); 29 | } 30 | } 31 | return matchers; 32 | } 33 | 34 | public static String getString(String patternId, String thing) { 35 | List strs = getStrings(patternId, thing); 36 | if (strs.size() == 0) return null; 37 | return strs.get(0); 38 | } 39 | 40 | @Deprecated 41 | public static void inputWenyan(WenYanCompilerImpl compiler, int wenyanIndex) { 42 | compiler.getNowCompiling().add(wenyanIndex); 43 | } 44 | 45 | 46 | public static String getStringFrom(String patternId, String thing, String start) { 47 | String value = getString(patternId, thing); 48 | return value.substring(value.indexOf(start) + 1); 49 | } 50 | 51 | public static String getStringFrom(String patternId, String thing, String start, String end) { 52 | String value = getString(patternId, thing); 53 | if (patternId.equals(WenYanLib.STRING()) || patternId.equals(WenYanLib.COMMENT())) { 54 | if (value == null) { 55 | value = getString(WenYanLib.ONLY_STRING(), thing); 56 | } 57 | } 58 | return value.substring(value.indexOf(start) + start.length(), value.lastIndexOf(end)); 59 | } 60 | 61 | public static boolean matches(String thing, String patternId) { 62 | return thing.matches(WenYanLib.syntaxs().get(patternId).get()); 63 | } 64 | 65 | public static boolean matches(List wenyan, String patternId) { 66 | if (wenyan.size() == 0) return false; 67 | return matches(wenyan.get(0), patternId); 68 | } 69 | 70 | public static String getWenyanFromArray(String[] wenyans) { 71 | StringBuilder builder = new StringBuilder(); 72 | for (String wenyan : wenyans) { 73 | builder.append(wenyan).append("。"); 74 | } 75 | return builder.toString(); 76 | } 77 | 78 | public static String getValue(String number, VariableCompileStream stream){ 79 | return getValue(number,stream,false); 80 | } 81 | 82 | public static int indexOf(String str,char s){ 83 | char[] arr = str.toCharArray(); 84 | int stringCount = 0; 85 | int ind = 0; 86 | for(char x : arr){ 87 | if(x == '「'){ 88 | stringCount++; 89 | } 90 | if(x == '」'){ 91 | stringCount--; 92 | } 93 | if(stringCount==0){ 94 | if(x == '之'){ 95 | break; 96 | } 97 | } 98 | ind++; 99 | } 100 | return ind; 101 | } 102 | public static String getValue(String number, VariableCompileStream stream,boolean setNow) { 103 | Language language = stream.getLanguage(); 104 | if (number.equals("其然")) { 105 | return stream.getNowName(); 106 | } 107 | if (number.equals("其不然")) { 108 | return language.getSyntax(Syntax.NOT) + stream.getNowName(); 109 | } 110 | if (number.equals("空無")) { 111 | return language.getSyntax(Syntax.NULL); 112 | } 113 | if (number.equals("矣")) { 114 | return stream.getNowName() == null ? "" : stream.getNowName(); 115 | } 116 | 117 | if (number.matches(WenYanLib.LENGTH())) { 118 | //其餘 119 | if (number.endsWith("其餘")) { 120 | return LanguageUtils.slice(language, stream.getName(number.substring(0, number.lastIndexOf("之")), false)); 121 | } 122 | return LanguageUtils.size(language, stream.getName(number.substring(0, number.lastIndexOf("之")), false)); 123 | } 124 | if (Utils.getString(WenYanLib.GET(), number) != null) return stream.getArray(number, stream); 125 | if (number.equals("其")) { 126 | return stream.getNowName() == null ? language.getSyntax(Syntax.NULL) : stream.getNowName(); 127 | } 128 | if (number.equals(WenYanLib.FALSE()) || number.equals(WenYanLib.TRUE())) { 129 | return language.getSyntax(WenYanLib.bool().get(number).get()); 130 | } 131 | if (number.startsWith(WenYanLib.STRING_START()) && number.endsWith(WenYanLib.STRING_END())) { 132 | return stream.getString(number); 133 | } else if (number.startsWith(WenYanLib.NAME_START()) && number.endsWith(WenYanLib.NAME_END())) { 134 | return stream.getName(number, false,setNow,false); 135 | } else { 136 | return stream.getNumberString(number) + ""; 137 | } 138 | } 139 | 140 | public static String getClassName(String name) { 141 | return name.substring(0, name.lastIndexOf(".")).replace(File.separator, "."); 142 | } 143 | 144 | public static String getTraditionalChinese(String wenyan) { 145 | return ZhConverterUtil.convertToTraditional(wenyan); 146 | } 147 | 148 | public static boolean classExists(String clz) { 149 | try { 150 | Class.forName(clz); 151 | return true; 152 | } catch (Throwable e) { 153 | return false; 154 | } 155 | } 156 | 157 | public static int getClose(String returned) { 158 | char[] chars = returned.toCharArray(); 159 | int index = 0; 160 | for (char x : chars) { 161 | if (x == '{') index++; 162 | if (x == '}') index--; 163 | } 164 | return index; 165 | } 166 | 167 | 168 | } 169 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/plugins/PHPPlugin.groovy: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.plugins; 2 | 3 | import cn.wenyan.compiler.WenYanCompilerImpl 4 | import cn.wenyan.compiler.lib.ArrayUtils 5 | import cn.wenyan.compiler.lib.MathUtil 6 | import cn.wenyan.compiler.script.libs.Language 7 | import cn.wenyan.compiler.script.libs.Syntax 8 | import cn.wenyan.compiler.streams.CompileStream 9 | import scala.Tuple2 10 | import scala.collection.mutable.Map 11 | import static cn.wenyan.compiler.script.libs.Language.* 12 | 13 | import java.util.regex.Pattern 14 | 15 | 16 | class PHPPlugin extends Plugin { 17 | 18 | @Override 19 | void addSyntaxRegex(Map map) { 20 | 21 | } 22 | 23 | @Override 24 | void addPatterns(Map map) { 25 | 26 | } 27 | 28 | @Override 29 | void addCompileStream(List map) { 30 | 31 | } 32 | 33 | @Override 34 | void addListener(List map) { 35 | 36 | } 37 | 38 | @Override 39 | boolean onCanMatch(Tuple2 p, int index, String strings, java.util.Map patterns) { 40 | return false 41 | } 42 | 43 | @Override 44 | void init(WenYanCompilerImpl impl) { 45 | Language.addLanguage("PHP",[ 46 | (Syntax.VAR_DEFINE) : '$'+"$NAME = $VALUE", 47 | (Syntax.FOR_NUMBER) : "for(${'$'}_ans$INDEX = 0;${'$'}_ans$INDEX<$RANGE;_ans$INDEX++){", 48 | (Syntax.COMMENT) : "/*$COMMENT*/", 49 | (Syntax.FOR_EACH) : "foreach($ARRAY as $ELEMENT){", 50 | (Syntax.FOR_END) : "}", 51 | (Syntax.IF) : "if($BOOL){", 52 | (Syntax.IF_END) : "}", 53 | (Syntax.IF_BREAK) : "if($BOOL)break;", 54 | (Syntax.WHILE_TRUE) : "while(true){", 55 | (Syntax.ELSE) : "}else{", 56 | (Syntax.BREAK) : "break;", 57 | (Syntax.RETURN) : "return $VALUE", 58 | (Syntax.FUNCTION_END) : "}", 59 | (Syntax.DEFINE_FUNCTION) : "function $NAME($ARGS){",// 60 | (Syntax.FUNCTION_ARGS_SPLIT) : ",", 61 | (Syntax.IMPORT) : "import $LIB", 62 | (Syntax.IMPORT_STATIC) : "import static $LIB.$METHOD", 63 | (Syntax.IMPORT_STATIC_SEPARATE): "true", 64 | (Syntax.IMPORT_SPLIT) : "null", 65 | (Syntax.MATH_ADD) : "$NAME+$VALUE", 66 | (Syntax.MATH_LESS) : "$NAME-$VALUE", 67 | (Syntax.MATH_MULTI) : "$NAME*$VALUE", 68 | (Syntax.MATH_EXCEPT) : "$NAME/$VALUE", 69 | (Syntax.MATH_REMAIN) : "mod($NAME,$VALUE)", 70 | (Syntax.BIGGER) : ">", 71 | (Syntax.SMALLER) : "<", 72 | (Syntax.EQUAL) : "==", 73 | (Syntax.AND) : "&&", 74 | (Syntax.OR) : "||", 75 | (Syntax.PRINT) : "println($VALUE .toString())", 76 | (Syntax.NEGATE) : "!", 77 | (Syntax.CHANGE) : "$NAME = $VALUE", 78 | (Syntax.REPLACE_ARRAY) : "$NAME[getIndex($INDEX)] = $VALUE", 79 | (Syntax.STRING) : "\"\"\"", 80 | (Syntax.ARRAY_ADD) : NAME+".add($VALUE)", 81 | (Syntax.INNER_FUNCTION) : "def $NAME \n $NAME = {\n $ARGS->", 82 | (Syntax.INNER_FUNCTION_NO_ARGS): "def $NAME \n $NAME = {\n ", 83 | (Syntax.TRUE) : "true", 84 | (Syntax.FALSE) : "false", 85 | (Syntax.NOT_BIG_THAN) : "<=", 86 | (Syntax.NOT_SMALL_THAN) : ">=", 87 | (Syntax.NEGATE_EQUAL) : "!=", 88 | (Syntax.SLICE) : "ArrayUtils.slice(getArray($NAME))", 89 | (Syntax.SIZE) : "ArrayUtils.length(getArray($NAME))", 90 | (Syntax.RUN_FUNCTION) : "def $VALUE = $NAME($ARGS)", 91 | (Syntax.OBJECT_INNER) : ".", 92 | (Syntax.NUMBER_SUGAR) : "$NAME", 93 | (Syntax.STRING_APPEND) : "+", 94 | (Syntax.ARRAY_GET) : "getArray($NAME)[getIndex($INDEX)]", 95 | (Syntax.INT_TYPE) : "BigDecimal", 96 | (Syntax.STRING_TYPE) : "String", 97 | (Syntax.ARRAY_TYPE) : "JSArray", 98 | (Syntax.BOOL_TYPE) : "boolean", 99 | (Syntax.VAR_TYPE) : "def", 100 | (Syntax.DOUBLE_TYPE) : "double", 101 | (Syntax.FUNCTION_ARG_DEFINE): "${'$'}$NAME", 102 | (Syntax.NULL) : "null", 103 | (Syntax.DEFINE_ARRAY) : "new JSArray()", 104 | (Syntax.DEFINE_INT) : "0", 105 | (Syntax.DEFINE_STRING) : "''", 106 | (Syntax.IMPORT_WITH) : ("import cn.wenyan.compiler.lib.*\nimport static "+ ArrayUtils.name+".getArray\nimport static "+ArrayUtils.name+".getIndex\nimport static "+ MathUtil.name+".mod"), 107 | (Syntax.NOT) : "!", 108 | (Syntax.REQUIRE_SCRIPT) : "", 109 | (Syntax.CONTINUE) : "continue", 110 | (Syntax.ELSE_IF) : "}else ", 111 | (Syntax.CONCAT) : (NAME+".putAll($VALUE)"), 112 | (Syntax.TRY) : "try{", 113 | (Syntax.THROW) : ("Exception $NAME = new Exception($EXCEPTION)\nthrow $NAME"), 114 | (Syntax.CATCH) : "}catch($NAME){", 115 | (Syntax.EXCEPTION_IF) : (NAME+".message.equals($EXCEPTION)"), 116 | (Syntax.CATCH_END) : "}", 117 | (Syntax.SHELL_VAR) : "$NAME = $VALUE", 118 | (Syntax.DEFINE_OBJECT) : "[:]", 119 | (Syntax.DELETE) : (NAME+".remove($INDEX)"), 120 | (Syntax.OBJECT_TYPE) : ("Map "), 121 | (Syntax.DEFINE) : "def $NAME", 122 | (Syntax.GIVE_FUNCTION) : "$NAME = {\n $ARGS->", 123 | (Syntax.DEFINE_GIVE_FUNCTION) : "def $NAME = {\n $ARGS->" 124 | ],null,null,null) 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/lang/渾沌經.wy: -------------------------------------------------------------------------------- 1 | 疏曰『 2 | 3 | 此經乃改編者以順java之道 4 | 5 | 參見 https://github.com/wenyan-lang/wenyan/tree/master/lib 6 | 7 | 8 | 』 9 | 吾嘗觀「「格物」」之書。方悟「取物」「置物」「列物之端」「識類」之義。 10 | 11 | 吾有一言。曰「「「」」」。名之曰「引號」。 12 | 夫「引號」之一。名之曰「引起」。 13 | 夫「引號」之二。名之曰「引迄」。 14 | 吾有一列。名之曰「位名」。充「位名」 15 | 以「「〇」」以「「一」」以「「二」」以「「三」」以「「四」」 16 | 以「「五」」以「「六」」以「「七」」以「「八」」以「「九」」。 17 | 18 | 吾有一術。名之曰「斬渾沌」。欲行是術。必先得一言。曰「渾沌語」。乃行是術曰。 19 | 吾有一列。名之曰「諸咒」。充「諸咒」以「「物」」以「「言」」以「「數」」以「「爻」」以「「列」」以「「之」」以「「也」」。 20 | 吾有一列。名之曰「渾沌碎」。 21 | 有數一。名之曰「讀」。 22 | 有數零。名之曰「層」。 23 | 吾有一言。名之曰「辭」。 24 | 25 | 恆為是。若「讀」大於「渾沌語」之長者乃止也。 26 | 若「渾沌語」之「讀」等於「引起」者。 27 | 若「層」不等於零者。 28 | 夫「渾沌語」之「讀」。加其於「辭」。昔之「辭」者。今其是矣。 29 | 云云。 30 | 加「層」以一。昔之「層」者。今其是矣。 31 | 或若「渾沌語」之「讀」等於「引迄」者。 32 | 減「層」以一。昔之「層」者。今其是矣。 33 | 若「層」等於零者。 34 | 充「渾沌碎」以「辭」。 35 | 昔之「辭」者。今「「」」是矣。 36 | 若非。 37 | 夫「渾沌語」之「讀」。加其於「辭」。昔之「辭」者。今其是矣。 38 | 云云。 39 | 或若「層」大於零者。 40 | 夫「渾沌語」之「讀」。加其於「辭」。昔之「辭」者。今其是矣。 41 | 若非。 42 | 凡「諸咒」中之「咒」。 43 | 若「渾沌語」之「讀」等於「咒」者 44 | 充「渾沌碎」以「咒」。 45 | 乃止也。 46 | 云云。 47 | 云云。 48 | 加一以「讀」。昔之「讀」者。今其是矣云云。 49 | 乃得「渾沌碎」。 50 | 是謂「斬渾沌」之術也。 51 | 52 | 53 | 今有一術。名之曰「食渾沌」。欲行是術。必先得一言。曰「渾沌語」。乃行是術曰。 54 | 施「斬渾沌」於「渾沌語」。名之曰「渾沌碎」。 55 | 吾有一術。名之曰「食數」。 56 | 吾有一術名之曰「食列」。 57 | 吾有一術名之曰「食物」。 58 | 吾有一術。名之曰「食數」。欲行是術。必先得一言。曰「數名」。乃行是術曰。 59 | 吾有一數。曰一。名之曰「正負」。 60 | 夫「數名」之一。若其等於「「負」」者。 61 | 夫「數名」之其餘。昔之「數名」者。今其是矣。 62 | 昔之「正負」者。今負一是矣。 63 | 云云。 64 | 吾有二數。名之曰「整」曰「小」。 65 | 吾有二數。曰一曰一。名之曰「讀」曰「小長」。 66 | 有爻陰。名之曰「小耶」。 67 | 恆為是。若「讀」大於「數名」之長者乃止也。 68 | 若「讀」等於「「·」」者 69 | 昔之「小耶」者。今陽是矣。 70 | 若非。 71 | 有數一。名之曰「位」 72 | 恆為是。若「位」大於「位名」之長者乃止也。 73 | 若「位名」之「位」等於「數名」之「讀」者乃止也。 74 | 加一以「位」。昔之「位」者。今其是矣云云。 75 | 減「位」以一。昔之「位」者。今其是矣。 76 | 77 | 若「小耶」者。 78 | 乘「小」以十。加其以「位」。昔之「小」者。今其是矣。 79 | 加「小長」以一。昔之「小長」者。今其是矣。 80 | 若非。 81 | 乘「整」以十。加其以「位」。昔之「整」者。今其是矣。 82 | 云云。 83 | 云云。 84 | 加一以「讀」。昔之「讀」者。今其是矣云云。 85 | 為是「小長」遍。乘「小」以零又一分。昔之「小」者。今其是矣。云云。 86 | 加「整」以「小」。乘其以「正負」。乃得矣。 87 | 是謂「食數」之術也。 88 | 89 | 吾有一術名之曰「食列」。欲行是術。必先得一列。曰「渾沌碎」。乃行是術曰。 90 | 吾有一列。名之曰「渾沌列」。 91 | 有數一。名之曰「讀」。 92 | 恆為是。若「讀」大於「渾沌碎」之長者乃止也。 93 | 夫「渾沌碎」之「讀」。名之曰「類」 94 | 若「類」等於「「數」」者。 95 | 加「讀」以一。夫「渾沌碎」之其。取一以施「食數」。充「渾沌列」以其。 96 | 加「讀」以二。昔之「讀」者。今其是矣。 97 | 或若「類」等於「「言」」者。 98 | 加「讀」以一。夫「渾沌碎」之其。充「渾沌列」以其。 99 | 加「讀」以二。昔之「讀」者。今其是矣。 100 | 或若「類」等於「「爻」」者。 101 | 加「讀」以一。夫「渾沌碎」之其。 102 | 若其等於「「陰」」者。充「渾沌列」以陰。 103 | 若非。充「渾沌列」以陽也。 104 | 加「讀」以二。昔之「讀」者。今其是矣。 105 | 若非 106 | 吾有一數。名之曰「層」。 107 | 加「讀」以一。名之曰「次讀」。 108 | 吾有一列。名之曰「句」。 109 | 恆為是。若「次讀」大於「渾沌碎」之長者乃止也。 110 | 若「渾沌碎」之「次讀」等於「「物」」者。 111 | 加「層」以一。昔之「層」者。今其是矣。 112 | 或若「渾沌碎」之「次讀」等於「「列」」者。 113 | 加「層」以一。昔之「層」者。今其是矣。 114 | 或若「渾沌碎」之「次讀」等於「「也」」者。 115 | 若「層」等於零者。 116 | 若「類」等於「「物」」者。 117 | 施「食物」於「句」。充「渾沌列」以其。 118 | 若非。 119 | 施「食列」於「句」。充「渾沌列」以其。 120 | 云云。 121 | 乃止也。 122 | 減「層」以一。昔之「層」者。今其是矣。 123 | 云云。 124 | 夫「渾沌碎」之「次讀」。充「句」以其。 125 | 加「次讀」以一。昔之「次讀」者。今其是矣云云。 126 | 加「次讀」以一。昔之「讀」者。今其是矣 127 | 云云。 128 | 云云。 129 | 乃得「渾沌列」。 130 | 是謂「食列」之術也。 131 | 132 | 133 | 134 | 吾有一術名之曰「食物」。欲行是術。必先得一列。曰「渾沌碎」。乃行是術曰。 135 | 吾有一物。名之曰「渾沌物」。 136 | 有數二。名之曰「讀」。 137 | 恆為是。若「讀」大於「渾沌碎」之長者乃止也。 138 | 夫「渾沌碎」之「讀」。名之曰「端」。 139 | 加「讀」以一。夫「渾沌碎」之其。名之曰「類」。 140 | 141 | 若「類」等於「「數」」者。 142 | 加「讀」以二。夫「渾沌碎」之其。取一以施「食數」。施「置物」於「渾沌物」於「端」於其。 143 | 加「讀」以四。昔之「讀」者。今其是矣。 144 | 或若「類」等於「「言」」者。 145 | 加「讀」以二。夫「渾沌碎」之其。施「置物」於「渾沌物」於「端」於其。 146 | 加「讀」以四。昔之「讀」者。今其是矣。 147 | 或若「類」等於「「爻」」者。 148 | 加「讀」以二。夫「渾沌碎」之其。 149 | 若其等於「「陰」」者。施「置物」於「渾沌物」於「端」於陰。 150 | 若非。施「置物」於「渾沌物」於「端」於陽也。 151 | 加「讀」以四。昔之「讀」者。今其是矣。 152 | 若非 153 | 吾有一數。名之曰「層」。 154 | 加「讀」以二。名之曰「次讀」。 155 | 吾有一列。名之曰「句」。 156 | 恆為是。若「次讀」大於「渾沌碎」之長者乃止也。 157 | 若「渾沌碎」之「次讀」等於「「物」」者。 158 | 加「層」以一。昔之「層」者。今其是矣。 159 | 或若「渾沌碎」之「次讀」等於「「列」」者。 160 | 加「層」以一。昔之「層」者。今其是矣。 161 | 或若「渾沌碎」之「次讀」等於「「也」」者。 162 | 若「層」等於零者。 163 | 若「類」等於「「物」」者。 164 | 施「食物」於「句」。施「置物」於「渾沌物」於「端」於其。 165 | 若非。 166 | 施「食列」於「句」。施「置物」於「渾沌物」於「端」於其。 167 | 云云。 168 | 乃止也。 169 | 減「層」以一。昔之「層」者。今其是矣。 170 | 云云。 171 | 夫「渾沌碎」之「次讀」。充「句」以其。 172 | 加「次讀」以一。昔之「次讀」者。今其是矣云云。 173 | 加「次讀」以二。昔之「讀」者。今其是矣 174 | 云云。 175 | 云云。 176 | 乃得「渾沌物」。 177 | 是謂「食物」之術也。 178 | 179 | 夫「渾沌碎」之其餘。取一以施「食物」。乃得矣。 180 | 181 | 是謂「食渾沌」之術也。 182 | 183 | 184 | 今有一術。名之曰「包渾沌」。欲行是術。必先得一物。曰「渾沌物」。乃行是術曰。 185 | 吾有一言。曰「「 」」名之曰「挪符」。 186 | 吾有一言。曰「「\n」」名之曰「抬符」。 187 | 吾有一術。名之曰「包數」。 188 | 吾有一術。名之曰「暗包渾沌」。 189 | 吾有一術。名之曰「包列」。 190 | 吾有一術。名之曰「包物」。 191 | 吾有一術。名之曰「包數」。欲行是術。必先得一數曰「甲」。乃行是術曰。 192 | 吾有一言。名之曰「正負」。 193 | 若「甲」小於零者。 194 | 乘「甲」以負一。昔之「甲」者。今其是矣。 195 | 昔之「正負」者。今「「負」」是矣。 196 | 云云。 197 | 除「甲」以一。所餘幾何。名之曰「小數」 198 | 減「小數」於「甲」。名之曰「整數」。 199 | 吾有二言。名之曰「小」曰「整」。 200 | 恆為是。若「整數」不大於零者乃止也。 201 | 除「整數」以十。所餘幾何。名之曰「位」。 202 | 加「位」以一。夫「位名」之其。加其以「整」。昔之「整」者。今其是矣。 203 | 減「整數」以「位」。除其以十。昔之「整數」者。今其是矣。 204 | 云云。 205 | 恆為是。若「小數」不大於零者乃止也。 206 | 乘「小數」以十。昔之「小數」者。今其是矣。 207 | 除「小數」以一。所餘幾何。名之曰「位」。 208 | 加「位」以一。夫「位名」之其。加其於「小」。昔之「小」者。今其是矣。 209 | 減「小數」以「位」。昔之「小數」者。今其是矣。 210 | 云云。 211 | 加「正負」以「整」。昔之「整」者。今其是矣。 212 | 夫「小」之長。若其然者。 213 | 加「整」以「「·」」。加其以「小」。乃得矣。 214 | 云云。 215 | 乃得「整」。 216 | 是謂「包數」之術也。 217 | 218 | 吾有一術。名之曰「暗包渾沌」。欲行是術。必先得一言曰「類」。一元曰「實」。一數曰「挪抬」。乃行是術曰。 219 | 吾有一言。名之曰「渾沌語」。 220 | 若「類」等於「「物」」者。 221 | 加「渾沌語」以「抬符」昔之「渾沌語」者。今其是矣。 222 | 夫「實」。加「挪抬」以一。取二以施「包物」。加其於「渾沌語」。昔之「渾沌語」者。今其是矣。 223 | 為是「挪抬」遍。加「渾沌語」以「挪符」。昔之「渾沌語」者。今其是矣也。 224 | 加「渾沌語」以「「也」」加其以「抬符」。昔之「渾沌語」者。今其是矣。 225 | 226 | 或若「類」等於「「列」」者。 227 | 加「渾沌語」以「抬符」昔之「渾沌語」者。今其是矣。 228 | 夫「實」。加「挪抬」以一。取二以施「包列」。加其於「渾沌語」。昔之「渾沌語」者。今其是矣。 229 | 為是「挪抬」遍。加「渾沌語」以「挪符」。昔之「渾沌語」者。今其是矣也。 230 | 加「渾沌語」以「「也」」加其以「抬符」。昔之「渾沌語」者。今其是矣。 231 | 232 | 或若「類」等於「「言」」者。 233 | 加「渾沌語」以「引起」加其以「實」加其以「引迄」。加其以「抬符」昔之「渾沌語」者。今其是矣。 234 | 或若「類」等於「「爻」」者。 235 | 吾有一言。曰「「陽」」。名之曰「爻名」 236 | 夫「實」。若其不然者。昔之「爻名」者。今「「陰」」是矣也。 237 | 加「渾沌語」以「引起」加其以「爻名」加其以「引迄」。加其以「抬符」昔之「渾沌語」者。今其是矣。 238 | 或若「類」等於「「數」」者。 239 | 施「包數」於「實」。名之曰「數名」。 240 | 加「渾沌語」以「引起」加其以「數名」加其以「引迄」。加其以「抬符」昔之「渾沌語」者。今其是矣。 241 | 云云。 242 | 乃得「渾沌語」 243 | 是謂「暗包渾沌」之術也。 244 | 245 | 吾有一術。名之曰「包列」。欲行是術。必先得一物曰「渾沌列」。一數曰「挪抬」。乃行是術曰。 246 | 吾有一言。名之曰「渾沌語」。 247 | 凡「渾沌列」中之「實」 248 | 施「識類」於「實」。名之曰「類」。 249 | 250 | 為是「挪抬」遍。加「渾沌語」以「挪符」。昔之「渾沌語」者。今其是矣也。 251 | 加「渾沌語」以「類」。 252 | 昔之「渾沌語」者。今其是矣。 253 | 254 | 施「暗包渾沌」於「類」於「實」於「挪抬」。加其於「渾沌語」。昔之「渾沌語」者。今其是矣。 255 | 云云。 256 | 乃得「渾沌語」 257 | 是謂「包列」之術也。 258 | 259 | 吾有一術。名之曰「包物」。欲行是術。必先得一物曰「渾沌物」。一數曰「挪抬」。乃行是術曰。 260 | 261 | 吾有一言。名之曰「渾沌語」。 262 | 263 | 施「列物之端」於「渾沌物」。名之曰「諸端」。 264 | 265 | 凡「諸端」中之「端」 266 | 施「取物」於「渾沌物」於「端」。名之曰「實」。 267 | 施「識類」於「實」。名之曰「類」。 268 | 269 | 為是「挪抬」遍。加「渾沌語」以「挪符」。昔之「渾沌語」者。今其是矣也。 270 | 加「渾沌語」以「「之」」。加其以「引起」。加其以「端」。加其以「引迄」。加其以「類」。 271 | 昔之「渾沌語」者。今其是矣。 272 | 273 | 施「暗包渾沌」於「類」於「實」於「挪抬」。加其於「渾沌語」。昔之「渾沌語」者。今其是矣。 274 | 云云。 275 | 乃得「渾沌語」 276 | 是謂「包物」之術也。 277 | 278 | 施「包物」於「渾沌物」於一。名之曰「餛飩語」。 279 | 加「抬符」以「餛飩語」。加其於「「物」」。加其以「「也」」。乃得矣。 280 | 是謂「包渾沌」之術也。 281 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | net.noyark 8 | wenyan_lang 9 | 1.0-SNAPSHOT 10 | 11 | 12 | 13 | 14 | 15 | org.jsoup 16 | jsoup 17 | 1.14.2 18 | 19 | 20 | ch.obermuhlner 21 | big-math 22 | 2.3.0 23 | 24 | 25 | com.github.houbb 26 | opencc4j 27 | 1.0.2 28 | 29 | 30 | org.scala-lang 31 | scala-library 32 | 2.13.0 33 | compile 34 | 35 | 36 | org.scala-lang 37 | scala-compiler 38 | 2.13.0 39 | 40 | 41 | org.scala-lang 42 | scala-reflect 43 | 2.13.0 44 | 45 | 46 | commons-lang 47 | commons-lang 48 | 2.6 49 | 50 | 51 | compile 52 | org.codehaus.groovy 53 | groovy-all 54 | 2.3.11 55 | 56 | 57 | commons-io 58 | commons-io 59 | 2.7 60 | 61 | 62 | org.spockframework 63 | spock-core 64 | 0.6-groovy-1.8 65 | test 66 | 67 | 68 | junit 69 | junit 70 | 4.13.1 71 | 72 | 73 | 74 | 75 | 76 | 77 | org.apache.maven.plugins 78 | maven-shade-plugin 79 | 2.3 80 | 81 | 82 | package 83 | 84 | shade 85 | 86 | 87 | 88 | 89 | cn.wenyan.compiler.Main 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | org.codehaus.gmaven 98 | gmaven-plugin 99 | 1.3 100 | 101 | 102 | 103 | 104 | generateTestStubs 105 | testCompile 106 | 107 | 108 | 109 | true 110 | true 111 | true 112 | .groovy 113 | 1.7 114 | 115 | 116 | 117 | 118 | 119 | 120 | maven-assembly-plugin 121 | 122 | 123 | jar-with-dependencies 124 | 125 | 126 | 127 | 128 | make-assembly 129 | package 130 | 131 | single 132 | 133 | 134 | 135 | 136 | 137 | net.alchim31.maven 138 | scala-maven-plugin 139 | 3.2.2 140 | 141 | 142 | scala-compile-first 143 | process-resources 144 | 145 | add-source 146 | compile 147 | 148 | 149 | 150 | scala-test-compile 151 | process-test-resources 152 | 153 | testCompile 154 | 155 | 156 | 157 | 158 | 159 | org.apache.maven.plugins 160 | maven-compiler-plugin 161 | 3.2 162 | 163 | 1.8 164 | 1.8 165 | UTF-8 166 | 167 | 168 | 169 | org.codehaus.groovy 170 | groovy-eclipse-compiler 171 | 2.9.1-01 172 | 173 | 174 | 175 | org.codehaus.groovy 176 | groovy-eclipse-batch 177 | 2.3.7-01 178 | 179 | 180 | 181 | 182 | 183 | 184 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/script/libs/Language.groovy: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.script.libs 2 | 3 | import cn.wenyan.compiler.CompileBackend 4 | import cn.wenyan.compiler.GroovyCompiler 5 | import cn.wenyan.compiler.LanguageCompiler 6 | import cn.wenyan.compiler.WenyanToGroovyBackend 7 | import cn.wenyan.compiler.lib.ArrayUtils 8 | import cn.wenyan.compiler.lib.MathUtil 9 | import cn.wenyan.compiler.utils.GroovyPrettyCode 10 | import cn.wenyan.compiler.utils.PrettyCode 11 | import groovy.transform.CompileStatic 12 | import groovy.transform.TypeCheckingMode 13 | 14 | @CompileStatic 15 | class Language { 16 | 17 | public static final Language GROOVY = new Language([ 18 | (Syntax.VAR_DEFINE) : "def $NAME = $VALUE", 19 | (Syntax.FOR_NUMBER) : "for(_ans$INDEX in 1..$RANGE){", 20 | (Syntax.COMMENT) : "/*$COMMENT*/", 21 | (Syntax.FOR_EACH) : "for($ELEMENT in $ARRAY){", 22 | (Syntax.FOR_END) : "}", 23 | (Syntax.IF) : "if($BOOL){", 24 | (Syntax.IF_END) : "}", 25 | (Syntax.IF_BREAK) : "if($BOOL)break", 26 | (Syntax.WHILE_TRUE) : "while(true){", 27 | (Syntax.ELSE) : "}else{", 28 | (Syntax.BREAK) : "break", 29 | (Syntax.RETURN) : "return $VALUE", 30 | (Syntax.FUNCTION_END) : "}", 31 | (Syntax.DEFINE_FUNCTION) : "def $NAME($ARGS){",// 32 | (Syntax.FUNCTION_ARGS_SPLIT) : ",", 33 | (Syntax.IMPORT) : "import $LIB", 34 | (Syntax.IMPORT_STATIC) : "import static $LIB.$METHOD", 35 | (Syntax.IMPORT_STATIC_SEPARATE): "true", 36 | (Syntax.IMPORT_SPLIT) : "null", 37 | (Syntax.MATH_ADD) : "$NAME+$VALUE", 38 | (Syntax.MATH_LESS) : "$NAME-$VALUE", 39 | (Syntax.MATH_MULTI) : "$NAME*$VALUE", 40 | (Syntax.MATH_EXCEPT) : "$NAME/$VALUE", 41 | (Syntax.MATH_REMAIN) : "mod($NAME,$VALUE)", 42 | (Syntax.BIGGER) : ">", 43 | (Syntax.SMALLER) : "<", 44 | (Syntax.EQUAL) : "==", 45 | (Syntax.AND) : "&&", 46 | (Syntax.OR) : "||", 47 | (Syntax.PRINT) : "println($VALUE .toString())", 48 | (Syntax.NEGATE) : "!", 49 | (Syntax.CHANGE) : "$NAME = $VALUE", 50 | (Syntax.REPLACE_ARRAY) : "$NAME[getIndex($INDEX)] = $VALUE", 51 | (Syntax.STRING) : "\"\"\"", 52 | (Syntax.ARRAY_ADD) : NAME+".add($VALUE)", 53 | (Syntax.INNER_FUNCTION) : "def $NAME \n $NAME = {\n $ARGS->", 54 | (Syntax.INNER_FUNCTION_NO_ARGS): "def $NAME \n $NAME = {\n ", 55 | (Syntax.TRUE) : "true", 56 | (Syntax.FALSE) : "false", 57 | (Syntax.NOT_BIG_THAN) : "<=", 58 | (Syntax.NOT_SMALL_THAN) : ">=", 59 | (Syntax.NEGATE_EQUAL) : "!=", 60 | (Syntax.SLICE) : "ArrayUtils.slice(getArray($NAME))", 61 | (Syntax.SIZE) : "ArrayUtils.length(getArray($NAME))", 62 | (Syntax.RUN_FUNCTION) : "def $VALUE = $NAME($ARGS)", 63 | (Syntax.OBJECT_INNER) : ".", 64 | (Syntax.NUMBER_SUGAR) : "$NAME", 65 | (Syntax.STRING_APPEND) : "+", 66 | (Syntax.ARRAY_GET) : "getArray($NAME)[getIndex($INDEX)]", 67 | (Syntax.INT_TYPE) : "BigDecimal", 68 | (Syntax.STRING_TYPE) : "String", 69 | (Syntax.ARRAY_TYPE) : "JSArray", 70 | (Syntax.BOOL_TYPE) : "boolean", 71 | (Syntax.VAR_TYPE) : "def", 72 | (Syntax.DOUBLE_TYPE) : "double", 73 | (Syntax.FUNCTION_ARG_DEFINE) : "$TYPE $NAME", 74 | (Syntax.NULL) : "null", 75 | (Syntax.DEFINE_ARRAY) : "new JSArray()", 76 | (Syntax.DEFINE_INT) : "0", 77 | (Syntax.DEFINE_STRING) : "''", 78 | (Syntax.IMPORT_WITH) : ("import cn.wenyan.compiler.lib.*\nimport static "+ArrayUtils.name+".getArray\nimport static "+ArrayUtils.name+".getIndex\nimport static "+ MathUtil.name+".mod"), 79 | (Syntax.NOT) : "!", 80 | (Syntax.REQUIRE_SCRIPT) : "", 81 | (Syntax.CONTINUE) : "continue", 82 | (Syntax.ELSE_IF) : "}else ", 83 | (Syntax.CONCAT) : (NAME+".putAll($VALUE)"), 84 | (Syntax.TRY) : "try{", 85 | (Syntax.THROW) : ("Exception $NAME = new Exception($EXCEPTION)\nthrow $NAME"), 86 | (Syntax.CATCH) : "}catch($NAME){", 87 | (Syntax.EXCEPTION_IF) : (NAME+".message.equals($EXCEPTION)"), 88 | (Syntax.CATCH_END) : "}", 89 | (Syntax.SHELL_VAR) : "$NAME = $VALUE", 90 | (Syntax.DEFINE_OBJECT) : "[:]", 91 | (Syntax.DELETE) : (NAME+".remove($INDEX)"), 92 | (Syntax.OBJECT_TYPE) : ("Map "), 93 | (Syntax.DEFINE) : "def $NAME", 94 | (Syntax.GIVE_FUNCTION) : "$NAME = {\n $ARGS->", 95 | (Syntax.DEFINE_GIVE_FUNCTION) : "def $NAME = {\n $ARGS->" 96 | ],new GroovyCompiler(),new GroovyPrettyCode(),new WenyanToGroovyBackend()) 97 | 98 | 99 | 100 | static final String EXCEPTION ="%{exception}%" 101 | 102 | static final String TYPE = "%{type}%" 103 | 104 | static final String NAME = "%{name}%" 105 | 106 | static final String VALUE = "%{value}%" 107 | 108 | static final String INDEX = "%{index}%" 109 | 110 | static final String RANGE = "%{range}%" 111 | 112 | static final String COMMENT = "%{comment}%" 113 | 114 | static final String ELEMENT = "%{element}%" 115 | 116 | static final String ARRAY = "%{array}%" 117 | 118 | static final String BOOL = "%{bool}%" 119 | 120 | static final String ARGS = "%{args}%" 121 | 122 | static final String LIB = "%{lib}%" 123 | 124 | static final String METHOD = "%{method}%" 125 | 126 | protected Map syntaxLib 127 | 128 | protected LanguageCompiler compiler 129 | 130 | protected PrettyCode pretty 131 | 132 | protected CompileBackend backend 133 | 134 | static Map languageMap = [:] 135 | 136 | Language(Map syntaxLib,LanguageCompiler compiler,PrettyCode pretty,CompileBackend backend){ 137 | this.syntaxLib = syntaxLib 138 | this.compiler = compiler 139 | this.pretty = pretty 140 | this.backend = backend 141 | } 142 | 143 | String getSyntax(Syntax property){ 144 | return syntaxLib[property] 145 | } 146 | 147 | LanguageCompiler languageCompiler(){ 148 | return compiler 149 | } 150 | 151 | PrettyCode getPretty() { 152 | return pretty 153 | } 154 | 155 | CompileBackend getCompileBackend(){ 156 | return backend 157 | } 158 | 159 | @CompileStatic(TypeCheckingMode.SKIP) 160 | static void addLanguage(String name,Map syntaxLib,LanguageCompiler compiler,PrettyCode pretty,CompileBackend backend){ 161 | languageMap.put(name,new Language(syntaxLib,compiler,pretty,backend)) 162 | } 163 | 164 | static Language getLanguage(String name){ 165 | return languageMap.get(name) 166 | } 167 | 168 | } 169 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/utils/LexerUtils.scala: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.utils 2 | 3 | import java.util 4 | 5 | import cn.wenyan.compiler.{WenYanCompilerImpl, WenYanLib} 6 | import cn.wenyan.compiler.exceptions.SyntaxException 7 | 8 | 9 | import scala.util.control.Breaks 10 | 11 | /** 12 | * 实现断句 13 | */ 14 | 15 | object LexerUtils { 16 | 17 | class Counter{ 18 | var count = 0 19 | def add(): Unit = count += 1 20 | def cut(): Unit = count -= 1 21 | } 22 | 23 | val loop = Breaks 24 | 25 | def getWenYan(string: String,compiler : WenYanCompilerImpl) : String ={ 26 | val builder = new StringBuilder 27 | wenYanLexer(string,compiler).stream().forEach( 28 | x=>if(!x.equals(""))builder.append(x).append("。") 29 | ) 30 | builder.toString() 31 | } 32 | 33 | def getLine(string: util.List[String]) : String ={ 34 | var index =0 35 | val builder = new StringBuilder("\n") 36 | string.stream().forEach( 37 | x=> { 38 | if(!x.equals("")){ 39 | builder.append(index).append(": ").append(x).append("\n") 40 | index+=1 41 | } 42 | } 43 | ) 44 | builder.toString() 45 | } 46 | 47 | def newStringToCommon(string : String): String ={ 48 | 49 | var i = 0 50 | var count = 0 51 | var builder = new StringBuilder 52 | while (i{ 198 | hashMap.put(x._1,x._2) 199 | } 200 | } 201 | hashMap 202 | } 203 | 204 | 205 | 206 | 207 | def trimWenYanX(s: String):String = { 208 | val counter = new Counter 209 | s.trim.filter(x=>{ 210 | var bool = true 211 | if (x == '「' || x == '『') { 212 | counter.add() 213 | } 214 | if (x == '」' || x == '』'){ 215 | counter.cut() 216 | } 217 | 218 | if(counter.count == 0){ 219 | if(x == '\t'||x == '\n'||x == ' '){ 220 | bool = false 221 | } 222 | } 223 | 224 | bool 225 | 226 | }) 227 | } 228 | 229 | 230 | 231 | } 232 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/script/libs/LanguageUtils.groovy: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler.script.libs 2 | 3 | import cn.wenyan.compiler.WenYanLib 4 | import groovy.transform.CompileStatic 5 | 6 | @CompileStatic 7 | class LanguageUtils { 8 | 9 | private static boolean isShell = false 10 | 11 | static String defineVar(Language language,String name,String value){ 12 | Syntax syntax = Syntax.VAR_DEFINE 13 | if(isShell){ 14 | syntax = Syntax.SHELL_VAR 15 | } 16 | return language.getSyntax(syntax) 17 | .replace(Language.NAME,name) 18 | .replace(Language.VALUE, value) 19 | } 20 | 21 | static String defineVar(Language language,String name,String value,char type,boolean isStrong){ 22 | Syntax syntax = Syntax.VAR_DEFINE 23 | if(isShell){ 24 | syntax = Syntax.SHELL_VAR 25 | } 26 | String result = language.getSyntax(syntax) 27 | .replace(Language.NAME,name) 28 | .replace(Language.VALUE, value) 29 | if(isStrong){ 30 | return result.replace(language.getSyntax(Syntax.VAR_TYPE),language.getSyntax(WenYanLib.types().get(type.toString()).get())) 31 | }else{ 32 | return result 33 | } 34 | 35 | } 36 | 37 | static String defineArg(Language language,String name,char type){ 38 | return language.getSyntax(Syntax.FUNCTION_ARG_DEFINE) 39 | .replace(Language.NAME,name) 40 | .replace(Language.TYPE,"") 41 | //.replace(Language.TYPE,language.getSyntax(WenYanLib.types().get(type.toString()).get())) 42 | } 43 | 44 | 45 | 46 | static String addArray(Language language,String name,String value){ 47 | return language.getSyntax(Syntax.ARRAY_ADD) 48 | .replace(Language.NAME,name) 49 | .replace(Language.VALUE, value) 50 | } 51 | static String addComment(Language language,String comment){ 52 | return language.getSyntax(Syntax.COMMENT) 53 | .replace(Language.COMMENT,comment) 54 | } 55 | static String forNumber(Language language,String index,String range){ 56 | return language.getSyntax(Syntax.FOR_NUMBER) 57 | .replace(Language.INDEX,index) 58 | .replace(Language.RANGE,range) 59 | } 60 | static String defineIf(Language language,String bool){ 61 | return language.getSyntax(Syntax.IF) 62 | .replace(Language.BOOL,bool) 63 | } 64 | static String ifBreak(Language language,String bool){ 65 | return language.getSyntax(Syntax.IF_BREAK) 66 | .replace(Language.BOOL,bool) 67 | } 68 | 69 | static String forEach(Language language,String element,String array){ 70 | return language.getSyntax(Syntax.FOR_EACH) 71 | .replace(Language.ELEMENT,element) 72 | .replace(Language.ARRAY,array) 73 | } 74 | static String slice(Language language,String name){ 75 | return language.getSyntax(Syntax.SLICE) 76 | .replace(Language.NAME,name) 77 | } 78 | static String size(Language language,String name){ 79 | return language.getSyntax(Syntax.SIZE) 80 | .replace(Language.NAME,name) 81 | } 82 | static String defineFunction(Language language,String name,String args){ 83 | return language.getSyntax(Syntax.DEFINE_FUNCTION) 84 | .replace(Language.NAME,name) 85 | .replace(Language.ARGS,args) 86 | 87 | } 88 | static String giveFunction(Language language,String name,String args){ 89 | return language.getSyntax(Syntax.GIVE_FUNCTION) 90 | .replace(Language.NAME,name) 91 | .replace(Language.ARGS,args) 92 | } 93 | 94 | static String putAll(Language language,String name,String value){ 95 | return language.getSyntax(Syntax.CONCAT) 96 | .replace(Language.NAME,name) 97 | .replace(Language.VALUE,value) 98 | } 99 | 100 | static String defineInnerFunction(Language language,String name,String args,boolean outer){ 101 | String result = language.getSyntax(outer?Syntax.DEFINE_GIVE_FUNCTION:Syntax.INNER_FUNCTION) 102 | .replace(Language.NAME,name) 103 | .replace(Language.ARGS,args) 104 | if(isShell){ 105 | result = result.substring(result.indexOf("def")+3) 106 | } 107 | return result 108 | } 109 | 110 | static String defineInnerFunction(Language language,String name,boolean outer){ 111 | String result = language.getSyntax(outer?Syntax.DEFINE_GIVE_FUNCTION:Syntax.INNER_FUNCTION_NO_ARGS) 112 | .replace(Language.NAME,name) 113 | if(isShell){ 114 | result = result.substring(result.indexOf("def")+3) 115 | } 116 | return result 117 | } 118 | 119 | static String returnSomething(Language language,String value){ 120 | return language.getSyntax(Syntax.RETURN) 121 | .replace(Language.VALUE,value) 122 | } 123 | static String runFunction(Language language,String value,String name,String args){ 124 | return language.getSyntax(Syntax.RUN_FUNCTION) 125 | .replace(Language.NAME,name) 126 | .replace(Language.ARGS,args) 127 | .replace(Language.VALUE,value) 128 | } 129 | static String importStatic(Language language,String lib,String method){ 130 | return language.getSyntax(Syntax.IMPORT_STATIC) 131 | .replace(Language.LIB,lib) 132 | .replace(Language.METHOD,method) 133 | } 134 | 135 | static String importClass(Language language,String lib){ 136 | return language.getSyntax(Syntax.IMPORT) 137 | .replace(Language.LIB,lib) 138 | 139 | } 140 | 141 | static String numberSugar(Language language,String name){ 142 | return language.getSyntax(Syntax.NUMBER_SUGAR) 143 | .replace(Language.NAME,name) 144 | } 145 | static String println(Language language,String value){ 146 | return language.getSyntax(Syntax.PRINT) 147 | .replace(Language.VALUE,value) 148 | } 149 | static String change(Language language,String name,String value){ 150 | return language.getSyntax(Syntax.CHANGE) 151 | .replace(Language.NAME,name) 152 | .replace(Language.VALUE,value) 153 | } 154 | static String getArray(Language language,String name,String index){ 155 | return language.getSyntax(Syntax.ARRAY_GET) 156 | .replace(Language.NAME,name) 157 | .replace(Language.INDEX,index) 158 | } 159 | 160 | static String throwEx(Language language,String name,String exception){ 161 | return language.getSyntax(Syntax.THROW) 162 | .replace(Language.NAME,name) 163 | .replace(Language.EXCEPTION,exception) 164 | } 165 | 166 | static String define(Language language,String name){ 167 | return language.getSyntax(Syntax.DEFINE) 168 | .replace(Language.NAME,name) 169 | } 170 | 171 | static String catchEx(Language language,String name){ 172 | return language.getSyntax(Syntax.CATCH) 173 | .replace(Language.NAME,name) 174 | } 175 | 176 | static String ifEquals(Language language,String name,String exception){ 177 | return language.getSyntax(Syntax.EXCEPTION_IF) 178 | .replace(Language.NAME,name) 179 | .replace(Language.EXCEPTION,exception) 180 | } 181 | 182 | static String arraySet(Language language,String name,String index,String value){ 183 | return language.getSyntax(Syntax.REPLACE_ARRAY) 184 | .replace(Language.NAME,name) 185 | .replace(Language.INDEX,index) 186 | .replace(Language.VALUE,value) 187 | } 188 | 189 | static String removeArray(Language language,String name,String index){ 190 | return language.getSyntax(Syntax.DELETE) 191 | .replace(Language.NAME,name) 192 | .replace(Language.INDEX,index) 193 | } 194 | 195 | static void setShell(boolean shell){ 196 | isShell = shell 197 | } 198 | } 199 | -------------------------------------------------------------------------------- /.idea/uiDesigner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /src/main/java/cn/wenyan/compiler/PrepareCompiler.java: -------------------------------------------------------------------------------- 1 | package cn.wenyan.compiler; 2 | 3 | 4 | import cn.wenyan.compiler.lib.Define; 5 | import cn.wenyan.compiler.lib.Defines; 6 | import cn.wenyan.compiler.streams.FunctionCompileStream; 7 | import cn.wenyan.compiler.utils.GroovyUtils; 8 | import cn.wenyan.compiler.utils.LexerUtils; 9 | import cn.wenyan.compiler.utils.Utils; 10 | 11 | import java.io.File; 12 | import java.io.IOException; 13 | import java.util.ArrayList; 14 | import java.util.HashMap; 15 | import java.util.List; 16 | import java.util.Map; 17 | 18 | public class PrepareCompiler { 19 | 20 | private WenYanCompilerImpl compiler; 21 | 22 | private Map macroMapping;//macro -- wenyan 23 | 24 | private Map> macroNames; //macro -- names 25 | 26 | // pattern macro 27 | private Map macroPatterns; 28 | 29 | public PrepareCompiler(WenYanCompilerImpl compiler) { 30 | this.compiler = compiler; 31 | this.macroMapping = new HashMap<>(); 32 | this.macroNames = new HashMap<>(); 33 | this.macroPatterns = new HashMap<>(); 34 | } 35 | 36 | private void initMacro(Map get){ 37 | macroMapping.putAll(get); 38 | Map> names = getMacroNames(get); 39 | macroNames.putAll(names); 40 | 41 | macroPatterns.putAll(getMacroPatterns(get,names)); 42 | 43 | macroPatterns.forEach((x,y)->WenYanLib.syntaxs().put(y,x)); 44 | 45 | } 46 | 47 | 48 | 49 | public List macroPrepare(String wenyanCode){ 50 | 51 | Map get = getMacroMapping(wenyanCode); 52 | 53 | //初始化本文件的macro 54 | initMacro(get); 55 | 56 | //导入其他文件macro,前提是import不是宏的 57 | List strs = LexerUtils.wenYanLexer(wenyanCode,compiler); 58 | 59 | 60 | List imports = getImportsWenYan(strs); 61 | 62 | importMacro(imports); 63 | 64 | //展开 65 | expansion(strs); 66 | 67 | 68 | //重新解析 69 | List format = LexerUtils.wenYanLexer(getString(strs),compiler); 70 | 71 | imports = getImportsWenYan(format); 72 | 73 | //导入之前宏定义的导入语句的宏 74 | importMacro(imports); 75 | 76 | expansion(format); 77 | 78 | format = LexerUtils.wenYanLexer(getString(format),compiler); 79 | 80 | //编译import的文件 81 | compileImports(imports); 82 | 83 | return format; 84 | } 85 | 86 | private String getString(List strs){ 87 | StringBuilder builder = new StringBuilder(); 88 | for(String str : strs){ 89 | builder.append(str); 90 | } 91 | return builder.toString(); 92 | } 93 | 94 | 95 | private void expansion(List strs){ 96 | for(int i = 0;i{ 100 | if(str.matches(k)){ 101 | List ns = macroNames.get(v); 102 | List values = Utils.getStrings(WenYanLib.VALUE(),str); 103 | 104 | String result = macroMapping.get(v); 105 | for(int j = 0;j getImportsWenYan(List lists){ 118 | List list = new ArrayList<>(); 119 | FunctionCompileStream stream = compiler.getStream(FunctionCompileStream.class); 120 | for(int i = 0;i getMacroPatterns(Map macros,Map> names){ 129 | Map macrosPatterns = new HashMap<>(); 130 | macros.forEach((macro,value)->{ 131 | List macroNames = names.get(macro); 132 | String mac = macro; 133 | for(String name : macroNames){ 134 | mac = mac.replace(name,"[\\s\\S]+"); 135 | } 136 | 137 | macrosPatterns.put(mac,macro); 138 | }); 139 | return macrosPatterns; 140 | } 141 | 142 | String toAnnotation(String wenyanCode){ 143 | Map macros = getMacroMapping(wenyanCode); 144 | if(macros.size()!=0){ 145 | StringBuilder builder = new StringBuilder("@"+Defines.class.getSimpleName()+"(["); 146 | macros.forEach((x,y)->builder 147 | .append("\t@") 148 | .append(Define.class.getSimpleName()) 149 | .append("(before = ") 150 | .append("'") 151 | .append(x) 152 | .append("'") 153 | .append(",after = ") 154 | .append("'") 155 | .append(y) 156 | .append("'") 157 | .append("),\n") 158 | ); 159 | return builder.toString()+"])\n"; 160 | } 161 | 162 | return ""; 163 | } 164 | 165 | private Map> getMacroNames(Map macros){ 166 | Map> map = new HashMap<>(); 167 | 168 | macros.forEach((macro,name)->map.put(macro,Utils.getStrings(WenYanLib.VAR_NAME_FOR(),macro))); 169 | return map; 170 | } 171 | //被替换,替换成 172 | private Map getMacroMapping(String wenyanCode){ 173 | Map map = new HashMap<>(); 174 | List macros = getMacro(wenyanCode); 175 | for(int i = 0;i getMacro(String wenyanCode){ 186 | //从import中得到其他文件的宏 187 | List macros = new ArrayList<>(); 188 | StringBuilder builder = new StringBuilder(); 189 | char[] chars = LexerUtils.trimWenYanX(wenyanCode).toCharArray(); 190 | int close = 0; 191 | for(int i = 0;i imports){ 229 | try { 230 | Map macros = new HashMap<>(); 231 | for (String im : imports) { 232 | if (Utils.classExists(im)) { 233 | Class clz = Class.forName(im); 234 | Defines definesObj = clz.getAnnotation(Defines.class); 235 | if(definesObj!=null) { 236 | Define[] defines = definesObj.value(); 237 | for (Define define : defines) { 238 | macros.put(define.before(), define.after()); 239 | } 240 | initMacro(macros); 241 | } 242 | }else{ 243 | String file = compiler.getSourcePath()+"/"+im.replace(".", File.separator)+".wy"; 244 | initMacro(getMacroMapping(compiler.getWenYanCodeByFile(new File(file)))); 245 | } 246 | } 247 | }catch (ClassNotFoundException| IOException e){ 248 | compiler.getServerLogger().error("",e); 249 | } 250 | } 251 | 252 | private void compileImports(List imports){ 253 | for(String imp : imports) { 254 | if (compiler.getSourcePath() != null && !Utils.classExists(imp)) { 255 | 256 | String path = compiler.getSourcePath(); 257 | String filePath = path + File.separator + imp.replace(".", File.separator) + ".wy"; 258 | try { 259 | compiler.compileOut(compiler.getSourcePath(), new File(filePath), new File(compiler.getClassPath()), compiler.getMainClass(), true); 260 | } catch (Exception e) { 261 | compiler.getServerLogger().error("", e); 262 | } 263 | } 264 | } 265 | } 266 | 267 | } 268 | --------------------------------------------------------------------------------