mirror of
https://gitee.com/BDWare/genparser
synced 2025-04-27 14:32:15 +00:00
Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
00a3f79fb8 | |||
|
8e06d0bc81 | ||
|
b60e81e1a1 | ||
|
645f863d7b | ||
|
309a60e561 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
/build/
|
||||
/gen/
|
||||
/input/JavaScriptLexer.tokens
|
||||
/input/gen
|
4
README.md
Normal file
4
README.md
Normal file
@ -0,0 +1,4 @@
|
||||
1.修改input下面的`YJSParser.g4`
|
||||
2.运行`AntlrGenLexerTool`
|
||||
3.运行`AntlrGenParserTool`
|
||||
4.运行`CleanTempFiles`
|
@ -3,6 +3,8 @@ plugins {
|
||||
id 'java-library'
|
||||
}
|
||||
|
||||
apply from: '../spotless.gradle'
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
java {
|
||||
|
@ -1,23 +1,23 @@
|
||||
package org.bdware.sc.parser;
|
||||
|
||||
import org.antlr.v4.runtime.*;
|
||||
import java.util.Stack;
|
||||
public abstract class JavaScriptBaseLexer extends Lexer
|
||||
{
|
||||
|
||||
public abstract class JavaScriptBaseLexer extends Lexer {
|
||||
/**
|
||||
* Stores values of nested modes. By default mode is strict or
|
||||
* defined externally (useStrictDefault)
|
||||
* Stores values of nested modes. By default mode is strict or defined externally
|
||||
* (useStrictDefault)
|
||||
*/
|
||||
private Stack<Boolean> scopeStrictModes = new Stack<Boolean>();
|
||||
|
||||
private Token lastToken = null;
|
||||
/**
|
||||
* Default value of strict mode
|
||||
* Can be defined externally by setUseStrictDefault
|
||||
* Default value of strict mode Can be defined externally by setUseStrictDefault
|
||||
*/
|
||||
private boolean useStrictDefault = false;
|
||||
/**
|
||||
* Current value of strict mode
|
||||
* Can be defined during parsing, see StringFunctions.js and StringGlobal.js samples
|
||||
* Current value of strict mode Can be defined during parsing, see StringFunctions.js and
|
||||
* StringGlobal.js samples
|
||||
*/
|
||||
private boolean useStrictCurrent = false;
|
||||
|
||||
@ -39,10 +39,9 @@ public abstract class JavaScriptBaseLexer extends Lexer
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the next token from the character stream and records this last
|
||||
* token in case it resides on the default channel. This recorded token
|
||||
* is used to determine when the lexer could possibly match a regex
|
||||
* literal. Also changes scopeStrictModes stack if tokenize special
|
||||
* Return the next token from the character stream and records this last token in case it
|
||||
* resides on the default channel. This recorded token is used to determine when the lexer could
|
||||
* possibly match a regex literal. Also changes scopeStrictModes stack if tokenize special
|
||||
* string 'use strict';
|
||||
*
|
||||
* @return the next token from the character stream.
|
||||
@ -59,24 +58,20 @@ public abstract class JavaScriptBaseLexer extends Lexer
|
||||
return next;
|
||||
}
|
||||
|
||||
protected void ProcessOpenBrace()
|
||||
{
|
||||
useStrictCurrent = scopeStrictModes.size() > 0 && scopeStrictModes.peek() ? true : useStrictDefault;
|
||||
protected void ProcessOpenBrace() {
|
||||
useStrictCurrent =
|
||||
scopeStrictModes.size() > 0 && scopeStrictModes.peek() ? true : useStrictDefault;
|
||||
scopeStrictModes.push(useStrictCurrent);
|
||||
}
|
||||
|
||||
protected void ProcessCloseBrace()
|
||||
{
|
||||
protected void ProcessCloseBrace() {
|
||||
useStrictCurrent = scopeStrictModes.size() > 0 ? scopeStrictModes.pop() : useStrictDefault;
|
||||
}
|
||||
|
||||
protected void ProcessStringLiteral()
|
||||
{
|
||||
if (lastToken == null || lastToken.getType() == JavaScriptLexer.OpenBrace)
|
||||
{
|
||||
protected void ProcessStringLiteral() {
|
||||
if (lastToken == null || lastToken.getType() == JavaScriptLexer.OpenBrace) {
|
||||
String text = getText();
|
||||
if (text.equals("\"use strict\"") || text.equals("'use strict'"))
|
||||
{
|
||||
if (text.equals("\"use strict\"") || text.equals("'use strict'")) {
|
||||
if (scopeStrictModes.size() > 0)
|
||||
scopeStrictModes.pop();
|
||||
useStrictCurrent = true;
|
||||
@ -89,13 +84,13 @@ public abstract class JavaScriptBaseLexer extends Lexer
|
||||
* Returns {@code true} if the lexer can match a regex literal.
|
||||
*/
|
||||
protected boolean IsRegexPossible() {
|
||||
|
||||
|
||||
if (this.lastToken == null) {
|
||||
// No token has been produced yet: at the start of the input,
|
||||
// no division is possible, so a regex literal _is_ possible.
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
switch (this.lastToken.getType()) {
|
||||
case JavaScriptLexer.Identifier:
|
||||
case JavaScriptLexer.NullLiteral:
|
||||
@ -116,4 +111,4 @@ public abstract class JavaScriptBaseLexer extends Lexer
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,8 +3,8 @@ package org.bdware.sc.parser;
|
||||
import org.antlr.v4.runtime.*;
|
||||
|
||||
/**
|
||||
* All parser methods that used in grammar (p, prev, notLineTerminator, etc.)
|
||||
* should start with lower case char similar to parser rules.
|
||||
* All parser methods that used in grammar (p, prev, notLineTerminator, etc.) should start with
|
||||
* lower case char similar to parser rules.
|
||||
*/
|
||||
public abstract class JavaScriptBaseParser extends Parser {
|
||||
public JavaScriptBaseParser(TokenStream input) {
|
||||
@ -53,12 +53,12 @@ public abstract class JavaScriptBaseParser extends Parser {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} iff on the current index of the parser's token stream a
|
||||
* token of the given {@code type} exists on the {@code HIDDEN} channel.
|
||||
* Returns {@code true} iff on the current index of the parser's token stream a token of the
|
||||
* given {@code type} exists on the {@code HIDDEN} channel.
|
||||
*
|
||||
* @param type the type of the token on the {@code HIDDEN} channel to check.
|
||||
* @return {@code true} iff on the current index of the parser's token stream a
|
||||
* token of the given {@code type} exists on the {@code HIDDEN} channel.
|
||||
* @return {@code true} iff on the current index of the parser's token stream a token of the
|
||||
* given {@code type} exists on the {@code HIDDEN} channel.
|
||||
*/
|
||||
private boolean here(final int type) {
|
||||
|
||||
@ -72,14 +72,13 @@ public abstract class JavaScriptBaseParser extends Parser {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} iff on the current index of the parser's token stream a
|
||||
* token exists on the {@code HIDDEN} channel which either is a line terminator,
|
||||
* or is a multi line comment that contains a line terminator.
|
||||
* Returns {@code true} iff on the current index of the parser's token stream a token exists on
|
||||
* the {@code HIDDEN} channel which either is a line terminator, or is a multi line comment that
|
||||
* contains a line terminator.
|
||||
*
|
||||
* @return {@code true} iff on the current index of the parser's token stream a
|
||||
* token exists on the {@code HIDDEN} channel which either is a line
|
||||
* terminator, or is a multi line comment that contains a line
|
||||
* terminator.
|
||||
* @return {@code true} iff on the current index of the parser's token stream a token exists on
|
||||
* the {@code HIDDEN} channel which either is a line terminator, or is a multi line
|
||||
* comment that contains a line terminator.
|
||||
*/
|
||||
protected boolean lineTerminatorAhead() {
|
||||
|
||||
@ -111,4 +110,4 @@ public abstract class JavaScriptBaseParser extends Parser {
|
||||
return (type == YJSParser.MultiLineComment && (text.contains("\r") || text.contains("\n")))
|
||||
|| (type == YJSParser.LineTerminator);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -140,6 +140,7 @@ In: 'in';
|
||||
Try: 'try';
|
||||
Event: 'event';
|
||||
AtToken: '@';
|
||||
Sharable: 'sharable';
|
||||
|
||||
/// Event Semantics
|
||||
|
||||
@ -168,6 +169,7 @@ Import: 'import';
|
||||
Contract: 'contract';
|
||||
Module: 'module';
|
||||
Oracle: 'oracle';
|
||||
DoipModule: 'doipmodule';
|
||||
/// The following tokens are also considered to be FutureReservedWords
|
||||
/// when parsing strict mode
|
||||
|
||||
|
@ -38,7 +38,7 @@ program
|
||||
;
|
||||
|
||||
contractDeclar
|
||||
: annotations? (Contract|Module|Oracle) Identifier '{' clzOrFunctionDeclaration+ '}'
|
||||
: annotations? (Contract|Module|Oracle|DoipModule) Identifier '{' clzOrFunctionDeclaration+ '}'
|
||||
;
|
||||
|
||||
annotations
|
||||
@ -61,8 +61,15 @@ annotationLiteral
|
||||
clzOrFunctionDeclaration
|
||||
:classDeclaration
|
||||
|functionDeclaration
|
||||
|interfaceDeclaration
|
||||
|eventDeclaration
|
||||
|sharableDeclaration
|
||||
;
|
||||
|
||||
interfaceDeclaration
|
||||
: annotations? Interface Identifier '(' formalParameterList? ')' eos
|
||||
;
|
||||
|
||||
eventDeclaration
|
||||
:Event eventGlobalOrLocal? Identifier SemiColon
|
||||
|Event eventGlobalOrLocal? Identifier '(' eventSemantics? ')' SemiColon
|
||||
@ -114,6 +121,17 @@ block
|
||||
statementList
|
||||
: statement+
|
||||
;
|
||||
sharableDeclaration
|
||||
: sharableStatement
|
||||
;
|
||||
|
||||
sharableStatement
|
||||
: sharableModifier variableDeclarationList eos
|
||||
;
|
||||
|
||||
sharableModifier // let, const - ECMAScript 6
|
||||
: Sharable
|
||||
;
|
||||
|
||||
variableStatement
|
||||
: varModifier variableDeclarationList eos
|
||||
@ -435,6 +453,7 @@ keyword
|
||||
| Protected
|
||||
| Static
|
||||
| Yield
|
||||
| Sharable
|
||||
;
|
||||
|
||||
eos
|
||||
|
27
src/main/entry/AntlrGenLexerTool.java
Normal file
27
src/main/entry/AntlrGenLexerTool.java
Normal file
@ -0,0 +1,27 @@
|
||||
import org.antlr.v4.Tool;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
|
||||
public class AntlrGenLexerTool {
|
||||
public static void main(String[] args) throws IOException {
|
||||
processLexer();
|
||||
}
|
||||
|
||||
private static void processLexer() {
|
||||
String g5 = "JavaScriptLexer.g4";
|
||||
String pkg = "org.bdware.sc.parser";
|
||||
File from = new File("./genparser/input/" + g5);
|
||||
File out = new File(g5);
|
||||
out.delete();
|
||||
try {
|
||||
Files.copy(from.toPath(), out.toPath());
|
||||
Tool.main(new String[] {g5, "-package", pkg, "-o",
|
||||
"./common/src/main/gen/" + pkg.replaceAll("\\.", "/"), "-visitor"});
|
||||
new File(g5).delete();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
34
src/main/entry/AntlrGenParserTool.java
Normal file
34
src/main/entry/AntlrGenParserTool.java
Normal file
@ -0,0 +1,34 @@
|
||||
import org.antlr.v4.Tool;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
|
||||
public class AntlrGenParserTool {
|
||||
public static void main(String[] args) throws IOException {
|
||||
processParser();
|
||||
}
|
||||
|
||||
private static void processParser() {
|
||||
String g4 = "YJSParser.g4";
|
||||
String pkg;
|
||||
|
||||
// g4 = "ExprParser.g4";
|
||||
if (g4.equals("YJSParser.g4"))
|
||||
pkg = "org.bdware.sc.parser";
|
||||
else
|
||||
pkg = "org.bdware.sc.parser.test";
|
||||
System.out.println("GenerateAt:" + "./common/src/main/gen/" + pkg.replaceAll("\\.", "/"));
|
||||
File from = new File("./genparser/input/" + g4);
|
||||
|
||||
File out = new File(g4);
|
||||
out.delete();
|
||||
try {
|
||||
Files.copy(from.toPath(), out.toPath());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
Tool.main(new String[] {g4, "-package", pkg, "-o",
|
||||
"./common/src/main/gen/" + pkg.replaceAll("\\.", "/"), "-visitor"});
|
||||
}
|
||||
}
|
@ -1,8 +1,8 @@
|
||||
import org.antlr.v4.gui.TestRig;
|
||||
|
||||
public class AntlrTest {
|
||||
@SuppressWarnings("deprecation")
|
||||
public static void main(String[] args) throws Exception {
|
||||
TestRig.main(new String[] {});
|
||||
}
|
||||
@SuppressWarnings("deprecation")
|
||||
public static void main(String[] args) throws Exception {
|
||||
TestRig.main(new String[] {});
|
||||
}
|
||||
}
|
||||
|
@ -5,12 +5,10 @@ import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
|
||||
public class AntlrTool {
|
||||
@SuppressWarnings("deprecation")
|
||||
public static void main(String[] args) throws IOException {
|
||||
|
||||
processLexer();
|
||||
// processParser();
|
||||
|
||||
|
||||
processLexer();
|
||||
// processParser();
|
||||
}
|
||||
|
||||
private static void processParser() {
|
||||
@ -33,9 +31,10 @@ public class AntlrTool {
|
||||
e.printStackTrace();
|
||||
}
|
||||
// Tool.main(new String[] {});
|
||||
Tool.main(new String[]{g4, "-package", pkg, "-o", "./common/src/main/gen/" + pkg.replaceAll("\\.", "/"), "-visitor"});
|
||||
// Tool.main(new String[] { g5, "-package", pkg, "-o", "./gen/" +
|
||||
// pkg.replaceAll("\\.", "/"), "-visitor" });
|
||||
Tool.main(new String[] {g4, "-package", pkg, "-o",
|
||||
"./common/src/main/gen/" + pkg.replaceAll("\\.", "/"), "-visitor"});
|
||||
// Tool.main(new String[] { g5, "-package", pkg, "-o", "./gen/" +
|
||||
// pkg.replaceAll("\\.", "/"), "-visitor" });
|
||||
|
||||
System.out.println("DeleteFiles!");
|
||||
out.delete();
|
||||
@ -50,8 +49,8 @@ public class AntlrTool {
|
||||
out.delete();
|
||||
try {
|
||||
Files.copy(from.toPath(), out.toPath());
|
||||
Tool.main(new String[]{g5, "-package", pkg, "-o", "./common/src/main/gen/" +
|
||||
pkg.replaceAll("\\.", "/"), "-visitor"});
|
||||
Tool.main(new String[] {g5, "-package", pkg, "-o",
|
||||
"./common/src/main/gen/" + pkg.replaceAll("\\.", "/"), "-visitor"});
|
||||
new File(g5).delete();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
|
13
src/main/entry/CleanTempFiles.java
Normal file
13
src/main/entry/CleanTempFiles.java
Normal file
@ -0,0 +1,13 @@
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
public class CleanTempFiles {
|
||||
public static void main(String[] args) throws IOException {
|
||||
String g4 = "YJSParser.g4";
|
||||
File out = new File(g4);
|
||||
out.delete();
|
||||
String g5 = "JavaScriptLexer.g4";
|
||||
out = new File(g5);
|
||||
out.delete();
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user