package cx.ath.journeyman.JavaTranslator; import java.io.FileInputStream; import java.io.IOException; import org.antlr.v4.runtime.ANTLRInputStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.ParseTreeWalker; import cx.ath.journeyman.JavaTranslator.generated.JavaLexer; import cx.ath.journeyman.JavaTranslator.generated.JavaParser; public class JavaTranslator { /** * @param args */ public static void main(String[] args) { String Directory = "C:\\temp\\"; String filename = "Main.java"; String fullFilename = Directory + filename; try { FileInputStream fis = new FileInputStream(fullFilename); ANTLRInputStream input = new ANTLRInputStream(fis); JavaLexer lexer = new JavaLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); JavaParser parser = new JavaParser(tokens); ParseTree tree = parser.compilationUnit(); // parse System.out.println(tree.toStringTree()); ParseTreeWalker walker = new ParseTreeWalker(); // create standard // walker ExtractInterfaceListener extractor = new ExtractInterfaceListener( parser, "c:\\temp\\" + filename); walker.walk(extractor, tree); // initiate walk of tree with listener } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
In 2017, with the release of Delphi 10.2 Tokyo, Embarcadero introduced a specialized implementation of the Observer pattern into the System.Classes unit. While it has been in the wild for 9 years, it remains a "hidden" architecture for many, primarily because it serves as the invisible engine behind LiveBindings. Other than live bindings, you can also use the Observer pattern as a way to update component settings to the Windows registry, an .ini file, or persist it elsewhere.
System.Classes