mirror of
https://github.com/SuspiciousActivity/ByteEdit.git
synced 2026-08-13 17:56:17 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1a73814a81 | ||
|
|
08af91a3f7 | ||
|
|
ad975e67db | ||
|
|
4beaab1283 | ||
|
|
cfa278cd3b | ||
|
|
46c0596768 | ||
|
|
74e9491fcf | ||
|
|
198c76823b | ||
|
|
1c6a72d951 | ||
|
|
ed9b6a177b | ||
|
|
a9612c058c | ||
|
|
b86e8658e2 | ||
|
|
a0b955a6ae | ||
|
|
97422300c8 | ||
|
|
8832d67d8b | ||
|
|
71c224f83f | ||
|
|
71437eac81 | ||
|
|
5a5cb6425f | ||
|
|
a85171624b | ||
|
|
c2e22e55ad | ||
|
|
ea282d240e |
No files matched your search
@@ -15,6 +15,8 @@ import java.io.StringWriter;
|
||||
import java.net.URI;
|
||||
import java.nio.file.Files;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JFrame;
|
||||
@@ -106,7 +108,7 @@ public class CompilationBox extends JFrame {
|
||||
null, Arrays.asList(new JavaSourceFromString("Compiled", source))).call();
|
||||
String res = out.toString();
|
||||
if (res.isEmpty()) {
|
||||
SingleThreadedExecutor.execute(() -> {
|
||||
SingleThreadedExecutor.submit(() -> {
|
||||
try {
|
||||
File clazz = new File(tmpFolder, "Compiled.class");
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
@@ -122,7 +124,13 @@ public class CompilationBox extends JFrame {
|
||||
ClassNode node = new ClassNode();
|
||||
read.accept(node, 0);
|
||||
EnumDecompiler decompiler = EnumDecompiler.BYTEEDIT;
|
||||
String dis = decompiler.getDecompiler().decompile(node);
|
||||
ClassNode mainNode = node;
|
||||
|
||||
Map<String, ClassNode> classNodes;
|
||||
synchronized (Main.classNodes) {
|
||||
classNodes = new HashMap<>(Main.classNodes);
|
||||
}
|
||||
classNodes.put("Compiled", node);
|
||||
File[] files = tmpFolder.listFiles();
|
||||
if (files != null)
|
||||
for (File f : files) {
|
||||
@@ -137,22 +145,26 @@ public class CompilationBox extends JFrame {
|
||||
read = new ClassReader(baos.toByteArray());
|
||||
node = new ClassNode();
|
||||
read.accept(node, 0);
|
||||
dis += "\n" + decompiler.getDecompiler().decompile(node);
|
||||
classNodes.put(node.name, node);
|
||||
}
|
||||
compSuccess.textArea.setText(dis);
|
||||
compSuccess.textArea
|
||||
.setText(decompiler.getDecompiler().decompile(mainNode, classNodes));
|
||||
compSuccess.setVisible(true);
|
||||
} catch (IOException e2) {
|
||||
e2.printStackTrace();
|
||||
}
|
||||
});
|
||||
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(CompilationBox.this, res, "Error!", JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
try {
|
||||
for (File f : tmpFolder.listFiles()) {
|
||||
Files.delete(f.toPath());
|
||||
}
|
||||
Files.delete(tmpFolder.toPath());
|
||||
} catch (IOException e2) {
|
||||
e2.printStackTrace();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(CompilationBox.this, res, "Error!", JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
} catch (IOException e1) {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
@@ -160,7 +172,7 @@ public class CompilationBox extends JFrame {
|
||||
}, ctrlS, JComponent.WHEN_FOCUSED);
|
||||
}
|
||||
|
||||
class JavaSourceFromString extends SimpleJavaFileObject {
|
||||
private static class JavaSourceFromString extends SimpleJavaFileObject {
|
||||
final String code;
|
||||
|
||||
public JavaSourceFromString(String name, String code) {
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
package me.ByteEdit.boxes;
|
||||
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
@@ -60,13 +58,7 @@ public class GlobalSearchBox extends JFrame {
|
||||
contentPane.add(lblFind);
|
||||
txtString = new JTextField();
|
||||
KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
|
||||
txtString.registerKeyboardAction(new ActionListener() {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
find();
|
||||
}
|
||||
}, enter, JComponent.WHEN_IN_FOCUSED_WINDOW);
|
||||
txtString.registerKeyboardAction(e -> find(), enter, JComponent.WHEN_IN_FOCUSED_WINDOW);
|
||||
txtString.setBounds(91, 22, 149, 20);
|
||||
contentPane.add(txtString);
|
||||
txtString.setColumns(10);
|
||||
@@ -74,12 +66,7 @@ public class GlobalSearchBox extends JFrame {
|
||||
chckbxCaseSensitive.setBounds(10, 199, 114, 23);
|
||||
contentPane.add(chckbxCaseSensitive);
|
||||
JButton btnFind = new JButton("Find");
|
||||
btnFind.addActionListener(new ActionListener() {
|
||||
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
find();
|
||||
}
|
||||
});
|
||||
btnFind.addActionListener(e -> find());
|
||||
btnFind.setBounds(130, 199, 110, 23);
|
||||
contentPane.add(btnFind);
|
||||
|
||||
@@ -92,12 +79,7 @@ public class GlobalSearchBox extends JFrame {
|
||||
contentPane.add(lblOwner);
|
||||
|
||||
txtOwner = new JTextField();
|
||||
txtOwner.addActionListener(new ActionListener() {
|
||||
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
find();
|
||||
}
|
||||
});
|
||||
txtOwner.addActionListener(e -> find());
|
||||
txtOwner.setColumns(10);
|
||||
txtOwner.setBounds(91, 78, 149, 20);
|
||||
contentPane.add(txtOwner);
|
||||
@@ -107,12 +89,7 @@ public class GlobalSearchBox extends JFrame {
|
||||
contentPane.add(lblName);
|
||||
|
||||
txtName = new JTextField();
|
||||
txtName.addActionListener(new ActionListener() {
|
||||
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
find();
|
||||
}
|
||||
});
|
||||
txtName.addActionListener(e -> find());
|
||||
txtName.setColumns(10);
|
||||
txtName.setBounds(91, 106, 149, 20);
|
||||
contentPane.add(txtName);
|
||||
@@ -122,12 +99,7 @@ public class GlobalSearchBox extends JFrame {
|
||||
contentPane.add(lblDesc);
|
||||
|
||||
txtDesc = new JTextField();
|
||||
txtDesc.addActionListener(new ActionListener() {
|
||||
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
find();
|
||||
}
|
||||
});
|
||||
txtDesc.addActionListener(e -> find());
|
||||
txtDesc.setColumns(10);
|
||||
txtDesc.setBounds(91, 134, 149, 20);
|
||||
contentPane.add(txtDesc);
|
||||
@@ -194,9 +166,7 @@ public class GlobalSearchBox extends JFrame {
|
||||
}
|
||||
}
|
||||
}
|
||||
for (Info s : set) {
|
||||
openBox.model.addElement(s);
|
||||
}
|
||||
set.forEach(openBox.model::addElement);
|
||||
openBox.setVisible(true);
|
||||
}
|
||||
}
|
||||
@@ -37,12 +37,10 @@ public class GlobalSearchOpenBox extends JFrame {
|
||||
JList<Info> list = new JList(model);
|
||||
list.addListSelectionListener(new ListSelectionListener() {
|
||||
public void valueChanged(ListSelectionEvent e) {
|
||||
SingleThreadedExecutor.execute(() -> {
|
||||
Info val = list.getSelectedValue();
|
||||
if (val != null && !val.owner.equals(Main.currentNodeName)) {
|
||||
Main.selectFile(val.nodePath);
|
||||
if (!e.getValueIsAdjusting() && val != null && !val.owner.equals(Main.currentNodeName)) {
|
||||
SingleThreadedExecutor.submit(() -> Main.selectFile(val.owner + ".class"));
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -59,14 +57,12 @@ public class GlobalSearchOpenBox extends JFrame {
|
||||
String name;
|
||||
String desc;
|
||||
MethodNode mn;
|
||||
String nodePath;
|
||||
|
||||
public Info(String owner, String name, String desc, MethodNode mn) {
|
||||
this.owner = owner;
|
||||
this.name = name;
|
||||
this.desc = desc;
|
||||
this.mn = mn;
|
||||
nodePath = Main.getFullName(owner);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -79,7 +79,7 @@ public class RenameBox extends JFrame {
|
||||
JOptionPane.showMessageDialog(null, "Desc not set!", "Error!", JOptionPane.ERROR_MESSAGE);
|
||||
return;
|
||||
}
|
||||
ClassNode clazz = Main.classNodes.get(Main.getFullName(className));
|
||||
ClassNode clazz = Main.classNodes.get(className);
|
||||
if (clazz == null) {
|
||||
JOptionPane.showMessageDialog(null, "ClassNode not found!", "Error!", JOptionPane.ERROR_MESSAGE);
|
||||
return;
|
||||
@@ -94,7 +94,7 @@ public class RenameBox extends JFrame {
|
||||
if (newDesc.startsWith("(")) { // method
|
||||
ClassNode lastHit = clazz;
|
||||
while (clazz != null && clazz.superName != null) {
|
||||
ClassNode tmp = Main.classNodes.get(Main.getFullName(clazz.superName));
|
||||
ClassNode tmp = Main.classNodes.get(clazz.superName);
|
||||
if (tmp != null) {
|
||||
boolean found = false;
|
||||
for (MethodNode mn : clazz.methods) {
|
||||
@@ -127,7 +127,7 @@ public class RenameBox extends JFrame {
|
||||
extendsMyClass = true;
|
||||
break;
|
||||
}
|
||||
ClassNode tmp = Main.classNodes.get(Main.getFullName(checkCN.superName));
|
||||
ClassNode tmp = Main.classNodes.get(checkCN.superName);
|
||||
if (tmp != null) {
|
||||
checkCN = tmp;
|
||||
} else {
|
||||
@@ -211,7 +211,7 @@ public class RenameBox extends JFrame {
|
||||
}
|
||||
}
|
||||
|
||||
SingleThreadedExecutor.execute(() -> {
|
||||
SingleThreadedExecutor.submit(() -> {
|
||||
// refresh
|
||||
Main.decompileCurrentNode();
|
||||
name = newName;
|
||||
|
||||
@@ -123,13 +123,16 @@ public class SearchBox extends JFrame {
|
||||
}
|
||||
|
||||
public void replace() {
|
||||
String txt = Main.txtByteEditView.getText();
|
||||
if (!Main.decompiler.isEditable())
|
||||
return;
|
||||
int startPos = Main.txtByteEditView.getSelectionStart();
|
||||
Main.txtByteEditView.replaceSelection(txtReplace.getText());
|
||||
Main.txtByteEditView.select(startPos, startPos + txtReplace.getText().length());
|
||||
}
|
||||
|
||||
public void replaceAll() {
|
||||
if (!Main.decompiler.isEditable())
|
||||
return;
|
||||
String toFind = txtFind.getText();
|
||||
String toReplace = txtReplace.getText();
|
||||
String txt = Main.txtByteEditView.getText();
|
||||
|
||||
@@ -40,12 +40,11 @@ public class TypeOpenBox extends JFrame {
|
||||
DefaultListModel<String> model = new DefaultListModel<>();
|
||||
JList<String> list = new JList(model);
|
||||
list.addListSelectionListener(new ListSelectionListener() {
|
||||
|
||||
@Override
|
||||
public void valueChanged(ListSelectionEvent e) {
|
||||
String val = list.getSelectedValue();
|
||||
if (val != null && !val.equals(Main.currentNodeName)) {
|
||||
|
||||
SingleThreadedExecutor.execute(() -> Main.selectFile(val));
|
||||
if (!e.getValueIsAdjusting() && val != null && !val.equals(Main.currentNodeName)) {
|
||||
SingleThreadedExecutor.submit(() -> Main.selectFile(val + ".class"));
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -80,19 +79,17 @@ public class TypeOpenBox extends JFrame {
|
||||
}
|
||||
String search = UnicodeUtils.unescape(null, txtSearch.getText(), true).toLowerCase();
|
||||
if (search.contains("/")) {
|
||||
for (String s : Main.classNodes.keySet()) {
|
||||
String className = s.substring(0, s.length() - 6);
|
||||
if (!className.contains("$") && className.toLowerCase().startsWith(search)) {
|
||||
model.addElement(s);
|
||||
for (String fullName : Main.classNodes.keySet()) {
|
||||
if (!fullName.contains("$") && fullName.toLowerCase().startsWith(search)) {
|
||||
model.addElement(fullName);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (String s : Main.classNodes.keySet()) {
|
||||
String[] split = s.split("/");
|
||||
for (String fullName : Main.classNodes.keySet()) {
|
||||
String[] split = fullName.split("/");
|
||||
String className = split[split.length - 1];
|
||||
className = className.substring(0, className.length() - 6);
|
||||
if (!className.contains("$") && className.toLowerCase().startsWith(search)) {
|
||||
model.addElement(s);
|
||||
model.addElement(fullName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,22 +5,17 @@ import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.benf.cfr.reader.PluginRunner;
|
||||
import org.benf.cfr.reader.api.ClassFileSource;
|
||||
import org.benf.cfr.reader.bytecode.analysis.parse.utils.Pair;
|
||||
import org.benf.cfr.reader.entities.ClassFile;
|
||||
import org.benf.cfr.reader.entities.Method;
|
||||
import org.benf.cfr.reader.entities.constantpool.ConstantPool;
|
||||
import org.benf.cfr.reader.state.ClassFileSourceImpl;
|
||||
import org.benf.cfr.reader.state.DCCommonState;
|
||||
import org.benf.cfr.reader.util.bytestream.BaseByteData;
|
||||
import org.benf.cfr.reader.util.MiscConstants.Version;
|
||||
import org.benf.cfr.reader.util.getopt.OptionsImpl;
|
||||
import org.benf.cfr.reader.util.output.ToStringDumper;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
import org.objectweb.asm.tree.MethodNode;
|
||||
|
||||
public class CFRDecompiler implements IDecompiler {
|
||||
|
||||
@@ -79,17 +74,24 @@ public class CFRDecompiler implements IDecompiler {
|
||||
options.put("sugarenums", "true");
|
||||
options.put("tidymonitors", "true");
|
||||
options.put("usenametable", "true");
|
||||
|
||||
try {
|
||||
Field f = Version.class.getDeclaredField("version");
|
||||
f.setAccessible(true);
|
||||
f.set(null, "ByteEdit");
|
||||
} catch (Exception ex) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String decompile(ClassNode cn) {
|
||||
return doDecompilation(cn, getBytes(cn), null);
|
||||
public String decompile(ClassNode cn, Map<String, ClassNode> classNodes) {
|
||||
return doDecompilation(cn, IDecompiler.getBytes(cn), classNodes);
|
||||
}
|
||||
|
||||
private static String doDecompilation(ClassNode cn, byte[] b, MethodNode mn) {
|
||||
private static String doDecompilation(ClassNode cn, byte[] b, Map<String, ClassNode> classNodes) {
|
||||
try {
|
||||
HashMap<String, String> ops = options;
|
||||
ClassFileSource cfs = new ClassFileSource() {
|
||||
ClassFileSource cfs = new ClassFileSourceImpl(new OptionsImpl(Collections.EMPTY_MAP)) {
|
||||
|
||||
@Override
|
||||
public void informAnalysisRelativePathDetail(String a, String b) {
|
||||
@@ -103,10 +105,16 @@ public class CFRDecompiler implements IDecompiler {
|
||||
@Override
|
||||
public Pair<byte[], String> getClassFileContent(String path) throws IOException {
|
||||
String name = path.substring(0, path.length() - 6);
|
||||
if (name.equals(cn.name)) {
|
||||
if (name.equals(cn.name))
|
||||
return Pair.make(b, name);
|
||||
// try loading other classes from jar
|
||||
ClassNode node;
|
||||
synchronized (classNodes) {
|
||||
node = classNodes.get(name);
|
||||
}
|
||||
return null; // cfr loads unnecessary classes
|
||||
if (node != null)
|
||||
return Pair.make(IDecompiler.getBytes(node), name);
|
||||
return super.getClassFileContent(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -114,24 +122,7 @@ public class CFRDecompiler implements IDecompiler {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
};
|
||||
PluginRunner runner = new PluginRunner(ops, cfs);
|
||||
if (mn != null) {
|
||||
BaseByteData data = new BaseByteData(b);
|
||||
ClassFile cf = new ClassFile(data, "", initDCState(ops, cfs));
|
||||
Field cpf = Method.class.getDeclaredField("cp");
|
||||
Field descI = Method.class.getDeclaredField("descriptorIndex");
|
||||
descI.setAccessible(true);
|
||||
cpf.setAccessible(true);
|
||||
for (Method m : cf.getMethodByName(mn.name)) {
|
||||
ConstantPool cp = (ConstantPool) cpf.get(m);
|
||||
if (cp.getUTF8Entry(descI.getInt(m)).getValue().equals(mn.desc)) {
|
||||
ToStringDumper tsd = new ToStringDumper();
|
||||
m.dump(tsd, true);
|
||||
return tsd.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
String decompilation = runner.getDecompilationFor(cn.name);
|
||||
String decompilation = new PluginRunner(ops, cfs).getDecompilationFor(cn.name);
|
||||
System.gc(); // cfr has a performance bug
|
||||
return decompilation;
|
||||
} catch (Exception e) {
|
||||
@@ -142,12 +133,4 @@ public class CFRDecompiler implements IDecompiler {
|
||||
return sw.toString();
|
||||
}
|
||||
}
|
||||
|
||||
private static DCCommonState initDCState(Map<String, String> optionsMap, ClassFileSource classFileSource) {
|
||||
OptionsImpl options = new OptionsImpl(optionsMap);
|
||||
if (classFileSource == null)
|
||||
classFileSource = new ClassFileSourceImpl(options);
|
||||
DCCommonState dcCommonState = new DCCommonState(options, classFileSource);
|
||||
return dcCommonState;
|
||||
}
|
||||
}
|
||||
@@ -6,8 +6,7 @@ import me.ByteEdit.edit.Disassembler;
|
||||
|
||||
public enum EnumDecompiler {
|
||||
BYTEEDIT("ByteEdit", new Disassembler(), false), PROCYON("Procyon", new ProcyonDecompiler()),
|
||||
FERNFLOWER("FernFlower", new FernflowerDecompiler()), JD_GUI("JD-GUI", new JDDecompiler()),
|
||||
CFR("CFR", new CFRDecompiler());
|
||||
JD_GUI("JD-GUI", new JDDecompiler()), CFR("CFR", new CFRDecompiler());
|
||||
|
||||
private final String name;
|
||||
private final IDecompiler decompiler;
|
||||
|
||||
@@ -1,142 +0,0 @@
|
||||
package me.ByteEdit.decompiler;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.util.HashMap;
|
||||
import java.util.jar.Manifest;
|
||||
|
||||
import org.jetbrains.java.decompiler.main.Fernflower;
|
||||
import org.jetbrains.java.decompiler.main.extern.IBytecodeProvider;
|
||||
import org.jetbrains.java.decompiler.main.extern.IFernflowerLogger;
|
||||
import org.jetbrains.java.decompiler.main.extern.IResultSaver;
|
||||
import org.jetbrains.java.decompiler.struct.ContextUnit;
|
||||
import org.jetbrains.java.decompiler.struct.StructClass;
|
||||
import org.jetbrains.java.decompiler.struct.StructContext;
|
||||
import org.jetbrains.java.decompiler.struct.lazy.LazyLoader;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
import org.objectweb.asm.tree.MethodNode;
|
||||
|
||||
public class FernflowerDecompiler implements IBytecodeProvider, IResultSaver, IDecompiler {
|
||||
|
||||
private byte[] bytes;
|
||||
private String returned;
|
||||
|
||||
public static final HashMap<String, Boolean> options = new HashMap<>();
|
||||
|
||||
static {
|
||||
options.put("rbr", true);
|
||||
options.put("rsy", false);
|
||||
options.put("din", true);
|
||||
options.put("dc4", true);
|
||||
options.put("das", true);
|
||||
options.put("hes", true);
|
||||
options.put("hdc", true);
|
||||
options.put("dgs", false);
|
||||
options.put("ner", true);
|
||||
options.put("den", true);
|
||||
options.put("rgn", true);
|
||||
options.put("lit", false);
|
||||
options.put("asc", true);
|
||||
options.put("bto", true);
|
||||
options.put("nns", false);
|
||||
options.put("uto", true);
|
||||
options.put("udv", true);
|
||||
options.put("rer", true);
|
||||
options.put("fdi", true);
|
||||
options.put("ren", false);
|
||||
options.put("inn", true);
|
||||
options.put("lac", false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String decompile(ClassNode cn) {
|
||||
return doDecompilation(cn, getBytes(cn), null);
|
||||
}
|
||||
|
||||
public String doDecompilation(ClassNode cn, byte[] b, MethodNode mn) {
|
||||
try {
|
||||
// TODO decompile method only
|
||||
this.bytes = b;
|
||||
HashMap<String, Object> map = new HashMap<>();
|
||||
for (String key : options.keySet()) {
|
||||
map.put(key, options.get(key) ? "1" : "0");
|
||||
}
|
||||
Fernflower f = new Fernflower(this, this, map, new IFernflowerLogger() {
|
||||
@Override
|
||||
public void writeMessage(String message, Throwable t) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeMessage(String message, Severity severity) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean accepts(Severity severity) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
StructContext sc = f.getStructContext();
|
||||
StructClass cl = new StructClass(b, true, sc.getLoader());
|
||||
sc.getClasses().put(cn.name, cl);
|
||||
// instead of loading a file use custom bridge, created a few getters
|
||||
String fakePath = new File("none.class").getAbsolutePath();
|
||||
ContextUnit unit = new ContextUnit(ContextUnit.TYPE_FOLDER, null, fakePath, true, sc.getSaver(),
|
||||
sc.getDecompiledData());
|
||||
sc.getUnits().put(fakePath, unit);
|
||||
unit.addClass(cl, "none.class");
|
||||
sc.getLoader().addClassLink(cn.name, new LazyLoader.Link(LazyLoader.Link.CLASS, fakePath, null));
|
||||
|
||||
f.decompileContext();
|
||||
return returned;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
StringWriter sw = new StringWriter();
|
||||
PrintWriter pw = new PrintWriter(sw);
|
||||
e.printStackTrace(pw);
|
||||
return sw.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getBytecode(String externalPath, String internalPath) throws IOException {
|
||||
return bytes;
|
||||
}
|
||||
|
||||
// we can ignore most of those methods because we do not want to save the output
|
||||
// as a file
|
||||
@Override
|
||||
public void saveFolder(String path) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void copyFile(String source, String path, String entryName) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveClassFile(String path, String qualifiedName, String entryName, String content, int[] mapping) {
|
||||
this.returned = content;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createArchive(String path, String archiveName, Manifest manifest) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveDirEntry(String path, String archiveName, String entryName) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void copyEntry(String source, String path, String archiveName, String entry) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveClassEntry(String path, String archiveName, String qualifiedName, String entryName,
|
||||
String content) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void closeArchive(String path, String archiveName) {
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,15 @@
|
||||
package me.ByteEdit.decompiler;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.objectweb.asm.ClassWriter;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
|
||||
public interface IDecompiler {
|
||||
|
||||
String decompile(ClassNode cn);
|
||||
String decompile(ClassNode cn, Map<String, ClassNode> classNodes);
|
||||
|
||||
default byte[] getBytes(ClassNode cn) {
|
||||
static byte[] getBytes(ClassNode cn) {
|
||||
ClassWriter classWriter = new ClassWriter(0);
|
||||
cn.accept(classWriter);
|
||||
return classWriter.toByteArray();
|
||||
|
||||
@@ -1,18 +1,26 @@
|
||||
package me.ByteEdit.decompiler;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.jd.core.v1.ClassFileToJavaSourceDecompiler;
|
||||
import org.jd.core.v1.api.loader.Loader;
|
||||
import org.jd.core.v1.api.loader.LoaderException;
|
||||
import org.jd.core.v1.api.printer.Printer;
|
||||
import org.objectweb.asm.ClassWriter;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
|
||||
import me.ByteEdit.main.Main;
|
||||
|
||||
public class JDDecompiler implements Loader, Printer, IDecompiler {
|
||||
|
||||
protected static final String TAB = " ";
|
||||
protected static final String NEWLINE = "\n";
|
||||
|
||||
protected int indentationCount = 0;
|
||||
protected StringBuilder sb = new StringBuilder();
|
||||
|
||||
private Map<String, ClassNode> classNodes;
|
||||
|
||||
@Override
|
||||
public String decompile(ClassNode cn) {
|
||||
public String decompile(ClassNode cn, Map<String, ClassNode> classNodes) {
|
||||
this.classNodes = classNodes;
|
||||
ClassFileToJavaSourceDecompiler decompiler = new ClassFileToJavaSourceDecompiler();
|
||||
try {
|
||||
decompiler.decompile(this, this, cn.name);
|
||||
@@ -32,22 +40,21 @@ public class JDDecompiler implements Loader, Printer, IDecompiler {
|
||||
|
||||
@Override
|
||||
public boolean canLoad(String internalName) {
|
||||
return Main.classNodes.containsKey(internalName + ".class");
|
||||
synchronized (classNodes) {
|
||||
return classNodes.containsKey(internalName);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] load(String internalName) throws LoaderException {
|
||||
ClassNode cl = Main.classNodes.get(internalName + ".class");
|
||||
ClassWriter cw = new ClassWriter(0);
|
||||
cl.accept(cw);
|
||||
return cw.toByteArray();
|
||||
ClassNode node;
|
||||
synchronized (classNodes) {
|
||||
node = classNodes.get(internalName);
|
||||
}
|
||||
if (node != null)
|
||||
return IDecompiler.getBytes(node);
|
||||
throw new LoaderException("Failed to load '" + internalName + "'");
|
||||
}
|
||||
|
||||
protected static final String TAB = " ";
|
||||
protected static final String NEWLINE = "\n";
|
||||
|
||||
protected int indentationCount = 0;
|
||||
protected StringBuilder sb = new StringBuilder();
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
|
||||
@@ -3,9 +3,9 @@ package me.ByteEdit.decompiler;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Map;
|
||||
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
import org.objectweb.asm.tree.MethodNode;
|
||||
|
||||
import com.strobel.assembler.InputTypeLoader;
|
||||
import com.strobel.assembler.metadata.Buffer;
|
||||
@@ -20,11 +20,11 @@ import com.strobel.decompiler.PlainTextOutput;
|
||||
public class ProcyonDecompiler implements IDecompiler {
|
||||
|
||||
@Override
|
||||
public String decompile(ClassNode cn) {
|
||||
return doDecompilation(cn, getBytes(cn), null);
|
||||
public String decompile(ClassNode cn, Map<String, ClassNode> classNodes) {
|
||||
return doDecompilation(cn, IDecompiler.getBytes(cn), classNodes);
|
||||
}
|
||||
|
||||
private static String doDecompilation(ClassNode cn, byte[] b, MethodNode mn) {
|
||||
private static String doDecompilation(ClassNode cn, byte[] b, Map<String, ClassNode> classNodes) {
|
||||
try {
|
||||
// TODO decompile method only
|
||||
DecompilerSettings settings = new DecompilerSettings();
|
||||
@@ -48,9 +48,18 @@ public class ProcyonDecompiler implements IDecompiler {
|
||||
buffer.putByteArray(b, 0, b.length);
|
||||
buffer.position(0);
|
||||
return true;
|
||||
} else {
|
||||
return backLoader.tryLoadType(s, buffer);
|
||||
}
|
||||
ClassNode node;
|
||||
synchronized (classNodes) {
|
||||
node = classNodes.get(s);
|
||||
}
|
||||
if (node != null) {
|
||||
byte[] data = IDecompiler.getBytes(node);
|
||||
buffer.putByteArray(data, 0, data.length);
|
||||
buffer.position(0);
|
||||
return true;
|
||||
}
|
||||
return backLoader.tryLoadType(s, buffer);
|
||||
}
|
||||
});
|
||||
TypeReference type = metadataSystem.lookupType(cn.name);
|
||||
|
||||
@@ -4,23 +4,41 @@ import java.util.concurrent.LinkedBlockingQueue;
|
||||
|
||||
public class SingleThreadedExecutor {
|
||||
|
||||
// We don't need to run every Runnable,
|
||||
// we only care about the last submitted Runnable.
|
||||
private static final Object lock = new Object();
|
||||
private static Runnable runnable;
|
||||
private static final LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
|
||||
|
||||
private static final Thread thread = new Thread(() -> {
|
||||
while (true) {
|
||||
try {
|
||||
queue.take().run();
|
||||
while (true) {
|
||||
Runnable r = null;
|
||||
synchronized (lock) {
|
||||
while (runnable == null)
|
||||
lock.wait();
|
||||
r = runnable;
|
||||
runnable = null;
|
||||
}
|
||||
try {
|
||||
r.run();
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
}
|
||||
}, "SingleThreadedExecutor");
|
||||
|
||||
static {
|
||||
thread.setPriority(Thread.MAX_PRIORITY);
|
||||
thread.start();
|
||||
}
|
||||
|
||||
public static void execute(Runnable r) {
|
||||
queue.add(r);
|
||||
public static void submit(Runnable r) {
|
||||
synchronized (lock) {
|
||||
runnable = r;
|
||||
lock.notifyAll();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import java.io.BufferedReader;
|
||||
import java.io.StringReader;
|
||||
import java.math.BigInteger;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
@@ -54,6 +55,7 @@ import me.ByteEdit.utils.UnicodeUtils;
|
||||
public class Assembler {
|
||||
|
||||
public static final Pattern SPACE = Pattern.compile(" ");
|
||||
private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
|
||||
|
||||
public static ClassNode assemble(String input) {
|
||||
Main.txtByteEditView.removeAllLineHighlights();
|
||||
@@ -338,6 +340,8 @@ public class Assembler {
|
||||
tryCatchBlocksToParse.clear();
|
||||
stage = 0;
|
||||
} else if (s.startsWith("// #Signature: ")) {
|
||||
if (node == null)
|
||||
throw new IllegalStateException("node is null");
|
||||
node.signature = UnicodeUtils.unescape(hsr, s.substring(15));
|
||||
} else if (s.equals("// #TryCatch:")) {
|
||||
stage = 1;
|
||||
@@ -351,6 +355,8 @@ public class Assembler {
|
||||
localVarsToParse.add(s);
|
||||
}
|
||||
} else if (s.equals("}")) {
|
||||
if (node == null)
|
||||
throw new IllegalStateException("node is null");
|
||||
if (!annotationsForNext.isEmpty()) {
|
||||
if (node.visibleAnnotations == null) {
|
||||
node.visibleAnnotations = new ArrayList<>();
|
||||
@@ -403,6 +409,8 @@ public class Assembler {
|
||||
}
|
||||
clazz.methods.add(node);
|
||||
} else if (!s.startsWith("\t")) {
|
||||
if (node == null)
|
||||
throw new IllegalStateException("node is null");
|
||||
s = s.substring(0, s.length() - 2);
|
||||
if (s.contains(" throws ")) {
|
||||
String exceptions = s.substring(s.lastIndexOf(" throws ") + 8);
|
||||
@@ -476,6 +484,8 @@ public class Assembler {
|
||||
s = s.substring(1);
|
||||
if (!temp.isEmpty()) {
|
||||
if (s.equals("]")) {
|
||||
if (node == null)
|
||||
throw new IllegalStateException("node is null");
|
||||
temp += s;
|
||||
node.instructions.add(getNode(hsr, temp, methodLabelMap));
|
||||
temp = "";
|
||||
@@ -486,6 +496,8 @@ public class Assembler {
|
||||
if (s.endsWith("[")) {
|
||||
temp += s + "\n";
|
||||
} else {
|
||||
if (node == null)
|
||||
throw new IllegalStateException("node is null");
|
||||
node.instructions.add(getNode(hsr, s, methodLabelMap));
|
||||
}
|
||||
}
|
||||
@@ -494,17 +506,20 @@ public class Assembler {
|
||||
}
|
||||
return clazz;
|
||||
} catch (Throwable e) {
|
||||
if (read != null) {
|
||||
System.err.println("Error at line: " + read.currentLine);
|
||||
try {
|
||||
Main.txtByteEditView.setCaretPosition(Main.txtByteEditView.getLineStartOffset(read.currentLine));
|
||||
} catch (BadLocationException e1) {
|
||||
System.err.println("Can't show line!");
|
||||
}
|
||||
}
|
||||
Main.showError(e.getMessage());
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
} finally {
|
||||
try {
|
||||
if (read != null)
|
||||
read.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
@@ -559,7 +574,9 @@ public class Assembler {
|
||||
String value = split2[1];
|
||||
if (value.endsWith("]"))
|
||||
value = value.substring(0, value.length() - 1);
|
||||
if (value.startsWith("{ ")) {
|
||||
if (value.equals("{ }")) {
|
||||
node.values.add(Collections.EMPTY_LIST);
|
||||
} else if (value.startsWith("{ ")) {
|
||||
String split3[] = splitWithStrings(value.substring(2, value.length() - 2));
|
||||
List<Object> list = new ArrayList<>();
|
||||
for (String rofl : split3) {
|
||||
@@ -599,26 +616,28 @@ public class Assembler {
|
||||
if (args.length == 0) {
|
||||
return null;
|
||||
}
|
||||
String ret = args[start];
|
||||
StringBuilder sb = new StringBuilder(args[start]);
|
||||
if (args.length > start + 1) {
|
||||
for (int i = start + 1; i < args.length; i++) {
|
||||
ret = ret + " " + args[i];
|
||||
sb.append(' ');
|
||||
sb.append(args[i]);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private static String consolidateStrings(String[] args, int start, int end) {
|
||||
if (end == 0) {
|
||||
return null;
|
||||
}
|
||||
String ret = args[start];
|
||||
StringBuilder sb = new StringBuilder(args[start]);
|
||||
if (end > start + 1) {
|
||||
for (int i = start + 1; i < end; i++) {
|
||||
ret = ret + " " + args[i];
|
||||
sb.append(' ');
|
||||
sb.append(args[i]);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private static Object getValue(HugeStringsRev hsr, String s, String to) {
|
||||
@@ -755,14 +774,8 @@ public class Assembler {
|
||||
String str = consolidateStrings(split, 1);
|
||||
Object val;
|
||||
try {
|
||||
if (str.startsWith("Type: ")) {
|
||||
str = str.substring(8, str.length() - 2);
|
||||
String[] split2 = str.split("\n\t");
|
||||
String type = split2[0].substring(7);
|
||||
// Reflection
|
||||
val = new Type(ClassUtil.getIDFromClassNameForType(type),
|
||||
UnicodeUtils.unescape(hsr, split2[3].substring(6, split2[3].length() - 1)),
|
||||
Integer.parseInt(split2[1].substring(7)), Integer.parseInt(split2[2].substring(5)));
|
||||
if (str.startsWith("Type ")) {
|
||||
val = Type.getType(UnicodeUtils.unescape(hsr, str.substring(6, str.length() - 1), true));
|
||||
} else if (str.startsWith("\"") && str.endsWith("\"")) {
|
||||
val = UnicodeUtils.unescape(hsr, str.substring(1, str.length() - 1), true);
|
||||
} else if (str.startsWith("#")) {
|
||||
@@ -1440,17 +1453,7 @@ public class Assembler {
|
||||
for (int i = 10; i < sp.length - 1; i++) {
|
||||
String st = sp[i].substring(1);
|
||||
if (st.equals("]")) {
|
||||
if (stage == 1) {
|
||||
try {
|
||||
// Reflection
|
||||
args.add(new Type(ClassUtil.getIDFromClassNameForType(vals.get(0).substring(6)),
|
||||
UnicodeUtils.unescape(hsr, vals.get(3).substring(6, vals.get(3).length() - 1)),
|
||||
Integer.parseInt(vals.get(1).substring(7)),
|
||||
Integer.parseInt(vals.get(2).substring(5))));
|
||||
} catch (Exception e) {
|
||||
throw e;
|
||||
}
|
||||
} else if (stage == 2) {
|
||||
if (stage == 2) {
|
||||
args.add(new Handle(OpcodesReverse.getHandleOpcode(vals.get(4).substring(5)),
|
||||
UnicodeUtils.unescape(hsr, vals.get(1).substring(7)),
|
||||
UnicodeUtils.unescape(hsr, vals.get(0).substring(6)),
|
||||
@@ -1459,11 +1462,8 @@ public class Assembler {
|
||||
vals.clear();
|
||||
}
|
||||
stage = 0;
|
||||
} else if (st.equals("Type: [")) {
|
||||
stage = 1;
|
||||
} else if (stage == 1) {
|
||||
st = st.substring(1);
|
||||
vals.add(st);
|
||||
} else if (st.startsWith("Type ")) {
|
||||
args.add(Type.getType(UnicodeUtils.unescape(hsr, st.substring(6, st.length() - 1), true)));
|
||||
} else if (st.equals("Handle: [")) {
|
||||
vals.clear();
|
||||
stage = 2;
|
||||
@@ -1484,12 +1484,6 @@ public class Assembler {
|
||||
}
|
||||
}
|
||||
}
|
||||
Object[] _args = new Object[args.size()];
|
||||
stage = 0;
|
||||
for (Object o : args) {
|
||||
_args[stage] = o;
|
||||
stage++;
|
||||
}
|
||||
return new InvokeDynamicInsnNode(UnicodeUtils.unescape(hsr, sp[0].substring(7)),
|
||||
UnicodeUtils.unescape(hsr, sp[1].substring(6)),
|
||||
new Handle(OpcodesReverse.getHandleOpcode(sp[7].substring(6)),
|
||||
@@ -1497,7 +1491,7 @@ public class Assembler {
|
||||
UnicodeUtils.unescape(hsr, sp[3].substring(7)),
|
||||
UnicodeUtils.unescape(hsr, sp[5].substring(7)),
|
||||
Boolean.parseBoolean(sp[6].substring(14))),
|
||||
_args);
|
||||
args.toArray(new Object[args.size()]));
|
||||
}
|
||||
case "new": {
|
||||
return new TypeInsnNode(187, UnicodeUtils.unescape(hsr, split[1]));
|
||||
@@ -1560,14 +1554,14 @@ public class Assembler {
|
||||
private static Object[] parseFrameList(HugeStringsRev hsr, String str, HashMap<LabelNode, Integer> labels) {
|
||||
ArrayList<Object> list = new ArrayList<>();
|
||||
String l = str.substring(1, str.length() - 1);
|
||||
if (l.isEmpty()) {
|
||||
return new Object[0];
|
||||
} else {
|
||||
if (l.isEmpty())
|
||||
return EMPTY_OBJECT_ARRAY;
|
||||
|
||||
for (String asd : l.split(", ")) {
|
||||
if (!asd.startsWith("(")) {
|
||||
int frameType = ClassUtil.getFrameTypeByName(asd);
|
||||
if (frameType != -1)
|
||||
list.add(new Integer(frameType));
|
||||
list.add(Integer.valueOf(frameType));
|
||||
else
|
||||
list.add(UnicodeUtils.unescape(hsr, asd.substring(1, asd.length() - 1)));
|
||||
} else {
|
||||
@@ -1590,14 +1584,7 @@ public class Assembler {
|
||||
}
|
||||
}
|
||||
}
|
||||
Object[] arr = new Object[list.size()];
|
||||
int c = 0;
|
||||
for (Object o : list) {
|
||||
arr[c] = o;
|
||||
c++;
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
return list.toArray(new Object[list.size()]);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -21,6 +21,8 @@ import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
@@ -69,8 +71,21 @@ public class Disassembler implements IDecompiler {
|
||||
.newFixedThreadPool((Runtime.getRuntime().availableProcessors() + 1) / 2);
|
||||
|
||||
@Override
|
||||
public String decompile(ClassNode cn) {
|
||||
return disassemble(cn);
|
||||
public String decompile(ClassNode cn, Map<String, ClassNode> classNodes) {
|
||||
String name = cn.name;
|
||||
StringBuilder dis = new StringBuilder(disassemble(cn));
|
||||
synchronized (classNodes) {
|
||||
for (Entry<String, ClassNode> entry : classNodes.entrySet()) {
|
||||
if (entry.getKey().contains("$")) {
|
||||
String[] split = entry.getKey().split("\\$");
|
||||
if (split[0].equals(name)) {
|
||||
dis.append('\n');
|
||||
dis.append(disassemble(entry.getValue()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return dis.toString();
|
||||
}
|
||||
|
||||
private static String disassemble(ClassNode classNode) {
|
||||
@@ -127,7 +142,7 @@ public class Disassembler implements IDecompiler {
|
||||
ctx.next("\n// #Fields\n");
|
||||
ctx.next(doFields(classNode.fields, hs));
|
||||
ctx.next("\n// #Methods\n");
|
||||
ctx.next(doMethods(classNode.methods, classNode.name, hs));
|
||||
ctx.next(doMethods(classNode.methods, hs));
|
||||
ctx.next("}\n");
|
||||
|
||||
if (!hs.isEmpty())
|
||||
@@ -154,7 +169,7 @@ public class Disassembler implements IDecompiler {
|
||||
s += o + " = [";
|
||||
valBefore = false;
|
||||
continue;
|
||||
} else {
|
||||
}
|
||||
if (o instanceof String[]) {
|
||||
String[] arr = (String[]) o;
|
||||
boolean w8ing = false;
|
||||
@@ -187,8 +202,12 @@ public class Disassembler implements IDecompiler {
|
||||
}
|
||||
s += ", ";
|
||||
}
|
||||
if (s.endsWith(", ")) {
|
||||
s = s.substring(0, s.length() - 2);
|
||||
s += " }], ";
|
||||
} else {
|
||||
s += "}], ";
|
||||
}
|
||||
} else if (o instanceof String) {
|
||||
s += "\"" + UnicodeUtils.escapeWithSpaces(hs, (String) o) + "\"], ";
|
||||
} else {
|
||||
@@ -196,7 +215,6 @@ public class Disassembler implements IDecompiler {
|
||||
}
|
||||
valBefore = true;
|
||||
}
|
||||
}
|
||||
if (s.endsWith(", "))
|
||||
s = s.substring(0, s.length() - 2);
|
||||
s += ")";
|
||||
@@ -207,7 +225,7 @@ public class Disassembler implements IDecompiler {
|
||||
return ctx.finish();
|
||||
}
|
||||
|
||||
private static String doMethods(List<MethodNode> methods, String className, HugeStrings hs)
|
||||
private static String doMethods(List<MethodNode> methods, HugeStrings hs)
|
||||
throws InterruptedException, ExecutionException {
|
||||
boolean multithreaded = Main.INSTANCE.mntmMultithreaded.isSelected();
|
||||
Future<String>[] futures = new Future[methods.size()];
|
||||
@@ -221,7 +239,7 @@ public class Disassembler implements IDecompiler {
|
||||
ms += "\t// #Max: l:" + mn.maxLocals + " s:" + mn.maxStack + "\n";
|
||||
if (mn.signature != null)
|
||||
ms += "\t// #Signature: " + UnicodeUtils.escapeWithSpaces(hs, mn.signature) + "\n";
|
||||
String[] dis = disassembleMethod(className, mn, hs);
|
||||
String[] dis = disassembleMethod(mn, hs);
|
||||
ms += dis[2];
|
||||
ms += dis[1];
|
||||
if (mn.visibleAnnotations != null && !mn.visibleAnnotations.isEmpty())
|
||||
@@ -286,20 +304,21 @@ public class Disassembler implements IDecompiler {
|
||||
return ctx.finish();
|
||||
}
|
||||
|
||||
private static String[] disassembleMethod(String className, MethodNode mn, HugeStrings hs) {
|
||||
private static String[] disassembleMethod(MethodNode mn, HugeStrings hs) {
|
||||
HashMap<Label, Integer> labels = new HashMap<Label, Integer>();
|
||||
String localVarTable;
|
||||
String tryCatchTable;
|
||||
|
||||
InsnList insnList = mn.instructions;
|
||||
boolean deobfNumbers = Main.INSTANCE.mntmNumbers.isSelected();
|
||||
boolean deobfNops = Main.INSTANCE.mntmNops.isSelected();
|
||||
|
||||
ArrayList<Label> labelsReversed = deobfNumbers ? new ArrayList<>() : null;
|
||||
|
||||
for (AbstractInsnNode n = insnList.getFirst(); n != null; n = n.getNext()) {
|
||||
if (n instanceof LabelNode) {
|
||||
int id = labels.size() + 1;
|
||||
if (deobfNumbers)
|
||||
if (deobfNumbers && labelsReversed != null)
|
||||
labelsReversed.add(((LabelNode) n).getLabel());
|
||||
labels.put(((LabelNode) n).getLabel(), id);
|
||||
}
|
||||
@@ -336,7 +355,7 @@ public class Disassembler implements IDecompiler {
|
||||
insnList = calc.get();
|
||||
int i = 0;
|
||||
for (AbstractInsnNode n = insnList.getFirst(); n != null; n = n.getNext()) {
|
||||
if (n instanceof LabelNode) {
|
||||
if (n instanceof LabelNode && labelsReversed != null) {
|
||||
((LabelNode) n).setLabel(labelsReversed.get(i++));
|
||||
}
|
||||
}
|
||||
@@ -344,6 +363,8 @@ public class Disassembler implements IDecompiler {
|
||||
|
||||
StringContext ctx = new StringContext(insnList.size());
|
||||
for (AbstractInsnNode n = insnList.getFirst(); n != null; n = n.getNext()) {
|
||||
if (deobfNops && n.getOpcode() == Opcodes.NOP)
|
||||
continue;
|
||||
ctx.next(disassembleInstruction(n, labels, hs));
|
||||
}
|
||||
return new String[] { ctx.finish(), localVarTable, tryCatchTable };
|
||||
@@ -359,9 +380,8 @@ public class Disassembler implements IDecompiler {
|
||||
if (n.getOpcode() == Opcodes.NEWARRAY) {
|
||||
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " "
|
||||
+ ClassUtil.getArrayTypeByID(node.operand) + "\n";
|
||||
} else {
|
||||
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " " + node.operand + "\n";
|
||||
}
|
||||
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " " + node.operand + "\n";
|
||||
}
|
||||
case VAR_INSN: {
|
||||
VarInsnNode node = (VarInsnNode) n;
|
||||
@@ -396,15 +416,7 @@ public class Disassembler implements IDecompiler {
|
||||
+ "\n\t\t\t]\n\t\t\targs: [\n";
|
||||
for (Object l : node.bsmArgs) {
|
||||
if (l instanceof Type) {
|
||||
Type type = (Type) l;
|
||||
int valueBegin = type.valueBegin;
|
||||
int valueEnd = type.valueEnd;
|
||||
String buf = type.valueBuffer;
|
||||
// Reflection
|
||||
s += "\t\t\t\tType: [\n\t\t\t\t\ttype: " + ClassUtil.getClassNameFromType(type)
|
||||
+ "\n\t\t\t\t\tstart: " + valueBegin + "\n\t\t\t\t\tend: " + valueEnd + "\n\t\t\t\t\tbuf: "
|
||||
+ ClassUtil.getDecompiledValue(buf, "", hs);
|
||||
s += "\n\t\t\t\t]\n";
|
||||
s += "\t\t\t\tType " + ClassUtil.getDecompiledValue(((Type) l).getDescriptor(), "", hs) + "\n";
|
||||
} else if (l instanceof Handle) {
|
||||
Handle h = (Handle) l;
|
||||
s += "\t\t\t\tHandle: [\n\t\t\t\t\tname: "
|
||||
@@ -433,17 +445,9 @@ public class Disassembler implements IDecompiler {
|
||||
case LDC_INSN: {
|
||||
LdcInsnNode node = (LdcInsnNode) n;
|
||||
if (node.cst instanceof Type) {
|
||||
Type type = (Type) node.cst;
|
||||
int valueBegin = type.valueBegin;
|
||||
int valueEnd = type.valueEnd;
|
||||
String buf = type.valueBuffer;
|
||||
// Reflection
|
||||
String s = "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " Type: [\n\t\t\ttype: "
|
||||
+ ClassUtil.getClassNameFromType(type) + "\n\t\t\tstart: " + valueBegin + "\n\t\t\tend: "
|
||||
+ valueEnd + "\n\t\t\tbuf: " + ClassUtil.getDecompiledValue(buf, "", hs);
|
||||
s += "\n\t\t]\n";
|
||||
return s;
|
||||
} else {
|
||||
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " Type "
|
||||
+ ClassUtil.getDecompiledValue(((Type) node.cst).getDescriptor(), "", hs) + "\n";
|
||||
}
|
||||
String decomp = ClassUtil.getDecompiledValue(node.cst, "", hs);
|
||||
if (node.cst instanceof String) {
|
||||
if (decomp.startsWith("\"#") && decomp.endsWith("\""))
|
||||
@@ -453,7 +457,6 @@ public class Disassembler implements IDecompiler {
|
||||
}
|
||||
return "\t\t" + OpcodesReverse.reverseOpcode(node.getOpcode()) + " " + decomp + "\n";
|
||||
}
|
||||
}
|
||||
case IINC_INSN: {
|
||||
IincInsnNode node = (IincInsnNode) n;
|
||||
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " " + node.var + " " + node.incr + "\n";
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
package me.ByteEdit.edit;
|
||||
|
||||
import java.awt.EventQueue;
|
||||
import java.awt.Toolkit;
|
||||
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
|
||||
public class OptionBox extends JFrame {
|
||||
|
||||
private JPanel contentPane;
|
||||
public JCheckBox chckbxComputeFrames;
|
||||
public JCheckBox chckbxComputeMax;
|
||||
|
||||
/**
|
||||
* Launch the application.
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
|
||||
public void run() {
|
||||
try {
|
||||
OptionBox frame = new OptionBox();
|
||||
frame.setVisible(true);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the frame.
|
||||
*/
|
||||
public OptionBox() {
|
||||
try {
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
setResizable(false);
|
||||
setTitle("Options");
|
||||
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
|
||||
setBounds((int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2 - 150),
|
||||
(int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight() / 2 - 100), 300, 200);
|
||||
contentPane = new JPanel();
|
||||
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
|
||||
setContentPane(contentPane);
|
||||
contentPane.setLayout(null);
|
||||
chckbxComputeFrames = new JCheckBox("Compute Frames");
|
||||
chckbxComputeFrames.setBounds(6, 7, 138, 23);
|
||||
contentPane.add(chckbxComputeFrames);
|
||||
chckbxComputeMax = new JCheckBox("Compute Max");
|
||||
chckbxComputeMax.setBounds(6, 33, 138, 23);
|
||||
contentPane.add(chckbxComputeMax);
|
||||
}
|
||||
}
|
||||
@@ -1,153 +0,0 @@
|
||||
package me.ByteEdit.edit;
|
||||
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.KeyStroke;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
|
||||
import me.ByteEdit.main.Main;
|
||||
|
||||
public class SearchBox extends JFrame {
|
||||
|
||||
public JPanel contentPane;
|
||||
public JTextField txtFind;
|
||||
public JTextField txtReplace;
|
||||
public JCheckBox chckbxCaseSensitive;
|
||||
|
||||
/**
|
||||
* Create the frame.
|
||||
*/
|
||||
public SearchBox() {
|
||||
try {
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
setResizable(false);
|
||||
setTitle("Find/Replace");
|
||||
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
|
||||
setBounds((int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2 - 128),
|
||||
(int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight() / 2 - 181), 256, 262);
|
||||
contentPane = new JPanel();
|
||||
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
|
||||
setContentPane(contentPane);
|
||||
contentPane.setLayout(null);
|
||||
JLabel lblFind = new JLabel("Find:");
|
||||
lblFind.setBounds(10, 25, 71, 14);
|
||||
contentPane.add(lblFind);
|
||||
txtFind = new JTextField();
|
||||
KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
|
||||
txtFind.registerKeyboardAction(new ActionListener() {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
find();
|
||||
}
|
||||
}, enter, JComponent.WHEN_IN_FOCUSED_WINDOW);
|
||||
txtFind.setBounds(91, 22, 149, 20);
|
||||
contentPane.add(txtFind);
|
||||
txtFind.setColumns(10);
|
||||
JLabel lblReplaceWith = new JLabel("Replace with:");
|
||||
lblReplaceWith.setBounds(10, 53, 71, 14);
|
||||
contentPane.add(lblReplaceWith);
|
||||
txtReplace = new JTextField();
|
||||
txtReplace.setColumns(10);
|
||||
txtReplace.setBounds(91, 50, 149, 20);
|
||||
contentPane.add(txtReplace);
|
||||
chckbxCaseSensitive = new JCheckBox("Case sensitive");
|
||||
chckbxCaseSensitive.setBounds(10, 103, 230, 23);
|
||||
contentPane.add(chckbxCaseSensitive);
|
||||
JButton btnFind = new JButton("Find");
|
||||
btnFind.addActionListener(new ActionListener() {
|
||||
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
find();
|
||||
}
|
||||
});
|
||||
btnFind.setBounds(10, 150, 110, 23);
|
||||
contentPane.add(btnFind);
|
||||
JButton btnReplacefind = new JButton("Replace/Find");
|
||||
btnReplacefind.addActionListener(new ActionListener() {
|
||||
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
replaceFind();
|
||||
}
|
||||
});
|
||||
btnReplacefind.setBounds(130, 150, 110, 23);
|
||||
contentPane.add(btnReplacefind);
|
||||
JButton btnReplace = new JButton("Replace");
|
||||
btnReplace.addActionListener(new ActionListener() {
|
||||
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
replace();
|
||||
}
|
||||
});
|
||||
btnReplace.setBounds(10, 184, 110, 23);
|
||||
contentPane.add(btnReplace);
|
||||
JButton btnReplaceAll = new JButton("Replace All");
|
||||
btnReplaceAll.addActionListener(new ActionListener() {
|
||||
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
replaceAll();
|
||||
}
|
||||
});
|
||||
btnReplaceAll.setBounds(130, 184, 110, 23);
|
||||
contentPane.add(btnReplaceAll);
|
||||
}
|
||||
|
||||
public void find() {
|
||||
int startPos = Main.txtByteEditView.getCaretPosition();
|
||||
String toFind = txtFind.getText();
|
||||
String txt = chckbxCaseSensitive.isSelected() ? Main.txtByteEditView.getText().substring(startPos)
|
||||
: Main.txtByteEditView.getText().substring(startPos).toLowerCase();
|
||||
int index = txt.indexOf(chckbxCaseSensitive.isSelected() ? toFind : toFind.toLowerCase());
|
||||
if (index == -1) {
|
||||
txt = chckbxCaseSensitive.isSelected() ? Main.txtByteEditView.getText()
|
||||
: Main.txtByteEditView.getText().toLowerCase();
|
||||
index = txt.indexOf(chckbxCaseSensitive.isSelected() ? toFind : toFind.toLowerCase());
|
||||
startPos = 0;
|
||||
if (index == -1) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
Main.txtByteEditView.select(startPos + index, startPos + index + toFind.length());
|
||||
}
|
||||
|
||||
public void replaceFind() {
|
||||
replace();
|
||||
find();
|
||||
}
|
||||
|
||||
public void replace() {
|
||||
String txt = Main.txtByteEditView.getText();
|
||||
int startPos = Main.txtByteEditView.getSelectionStart();
|
||||
Main.txtByteEditView.replaceSelection(txtReplace.getText());
|
||||
Main.txtByteEditView.select(startPos, startPos + txtReplace.getText().length());
|
||||
}
|
||||
|
||||
public void replaceAll() {
|
||||
String toFind = txtFind.getText();
|
||||
String toReplace = txtReplace.getText();
|
||||
String txt = Main.txtByteEditView.getText();
|
||||
int prev = Main.txtByteEditView.getCaretPosition();
|
||||
if (chckbxCaseSensitive.isSelected()) {
|
||||
Main.txtByteEditView.replaceRange(txt.replace(toFind, toReplace), 0, txt.length());
|
||||
} else {
|
||||
Main.txtByteEditView.replaceRange(txt.replaceAll("(?i)" + Pattern.quote(toFind), toReplace), 0,
|
||||
txt.length());
|
||||
}
|
||||
Main.txtByteEditView.setCaretPosition(prev);
|
||||
}
|
||||
}
|
||||
@@ -580,8 +580,10 @@ public class StackBasedCalculator implements Opcodes, Runnable {
|
||||
change(node);
|
||||
return false;
|
||||
case POP2:
|
||||
Number val = stack.pop();
|
||||
if (!(val instanceof Long) && !(val instanceof Double)) {
|
||||
stack.pop();
|
||||
stack.pop();
|
||||
}
|
||||
change(node);
|
||||
return false;
|
||||
case SWAP: {
|
||||
|
||||
@@ -1,121 +0,0 @@
|
||||
package me.ByteEdit.edit;
|
||||
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
|
||||
import javax.swing.DefaultListModel;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.ListSelectionModel;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
import javax.swing.event.DocumentEvent;
|
||||
import javax.swing.event.DocumentListener;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
|
||||
import me.ByteEdit.decompiler.SingleThreadedExecutor;
|
||||
import me.ByteEdit.main.Main;
|
||||
|
||||
public class TypeOpenBox extends JFrame {
|
||||
|
||||
public JPanel contentPane;
|
||||
public JTextField txtSearch;
|
||||
|
||||
/**
|
||||
* Create the frame.
|
||||
*/
|
||||
public TypeOpenBox() {
|
||||
try {
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
setResizable(false);
|
||||
setTitle("Open Type");
|
||||
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
|
||||
setBounds((int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2 - 200),
|
||||
(int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight() / 2 - 140), 400, 280);
|
||||
contentPane = new JPanel();
|
||||
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
|
||||
setContentPane(contentPane);
|
||||
contentPane.setLayout(null);
|
||||
|
||||
DefaultListModel<String> model = new DefaultListModel<>();
|
||||
JList<String> list = new JList(model);
|
||||
list.addListSelectionListener(new ListSelectionListener() {
|
||||
|
||||
public void valueChanged(ListSelectionEvent e) {
|
||||
String val = list.getSelectedValue();
|
||||
if (val != null && !val.equals(Main.currentNodeName)) {
|
||||
|
||||
SingleThreadedExecutor.execute(() -> Main.selectFile(val));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
txtSearch = new JTextField();
|
||||
txtSearch.addActionListener(new ActionListener() {
|
||||
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if (model.size() == 1) {
|
||||
list.setSelectedIndex(0);
|
||||
}
|
||||
}
|
||||
});
|
||||
txtSearch.getDocument().addDocumentListener(new DocumentListener() {
|
||||
|
||||
public void changedUpdate(DocumentEvent e) {
|
||||
updateList();
|
||||
}
|
||||
|
||||
public void removeUpdate(DocumentEvent e) {
|
||||
updateList();
|
||||
}
|
||||
|
||||
public void insertUpdate(DocumentEvent e) {
|
||||
updateList();
|
||||
}
|
||||
|
||||
public void updateList() {
|
||||
model.clear();
|
||||
if (txtSearch.getText().isEmpty()) {
|
||||
return;
|
||||
}
|
||||
String search = txtSearch.getText().toLowerCase();
|
||||
if (search.contains("/")) {
|
||||
for (String s : Main.classNodes.keySet()) {
|
||||
String className = s.substring(0, s.length() - 6);
|
||||
if (!className.contains("$") && className.toLowerCase().startsWith(search)) {
|
||||
model.addElement(s);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (String s : Main.classNodes.keySet()) {
|
||||
String[] split = s.split("/");
|
||||
String className = split[split.length - 1];
|
||||
className = className.substring(0, className.length() - 6);
|
||||
if (!className.contains("$") && className.toLowerCase().startsWith(search)) {
|
||||
model.addElement(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
txtSearch.setBounds(10, 11, 374, 20);
|
||||
contentPane.add(txtSearch);
|
||||
txtSearch.setColumns(10);
|
||||
|
||||
JScrollPane scrollPane = new JScrollPane();
|
||||
scrollPane.setBounds(10, 46, 374, 194);
|
||||
contentPane.add(scrollPane);
|
||||
|
||||
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||
scrollPane.setViewportView(list);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,198 @@
|
||||
package me.ByteEdit.main;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipFile;
|
||||
|
||||
import javax.swing.tree.DefaultTreeModel;
|
||||
|
||||
import org.objectweb.asm.ClassReader;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
|
||||
public class ArchiveTreeModel extends DefaultTreeModel {
|
||||
|
||||
public final ArrayList<String> paths = new ArrayList<>();
|
||||
private final HashMap<String, ClassNode> classNodes;
|
||||
private final HashMap<String, byte[]> otherFiles;
|
||||
private final ZipFile jar;
|
||||
|
||||
public boolean newCreated = false;
|
||||
|
||||
public ArchiveTreeModel(HashMap<String, ClassNode> classNodes, HashMap<String, byte[]> otherFiles) {
|
||||
super(new ByteEditTreeNode("New"));
|
||||
this.newCreated = true;
|
||||
this.jar = null;
|
||||
this.classNodes = classNodes;
|
||||
this.otherFiles = otherFiles;
|
||||
}
|
||||
|
||||
public ArchiveTreeModel(ZipFile jar, HashMap<String, ClassNode> classNodes, HashMap<String, byte[]> otherFiles) {
|
||||
super(new ByteEditTreeNode(jar.getName().split(File.separator.equals("\\") ? "\\\\"
|
||||
: File.separator)[jar.getName().split(File.separator.equals("\\") ? "\\\\" : File.separator).length
|
||||
- 1]));
|
||||
this.newCreated = false;
|
||||
this.jar = jar;
|
||||
this.classNodes = classNodes;
|
||||
this.otherFiles = otherFiles;
|
||||
initialize();
|
||||
}
|
||||
|
||||
private void initialize() {
|
||||
try {
|
||||
classNodes.clear();
|
||||
otherFiles.clear();
|
||||
Enumeration<? extends ZipEntry> enumeration = jar.entries();
|
||||
while (enumeration.hasMoreElements()) {
|
||||
ZipEntry next = enumeration.nextElement();
|
||||
byte[] data = toByteArray(jar.getInputStream(next));
|
||||
if (next.getSize() != 0 && !next.getName().startsWith("META-INF")
|
||||
&& (next.getName().endsWith(".class") || next.getName().endsWith(".class/"))) {
|
||||
try {
|
||||
ClassReader reader = new ClassReader(data);
|
||||
ClassNode node = new ClassNode();
|
||||
reader.accept(node, 0);
|
||||
classNodes.put(node.name, node);
|
||||
|
||||
if ((next.getName().contains("/")
|
||||
? (!Main.patternSlash
|
||||
.split(next.getName())[Main.patternSlash.split(next.getName()).length - 1]
|
||||
.contains("$"))
|
||||
: (!next.getName().contains("$")))
|
||||
|| (next.getName().startsWith("$") || next.getName().contains("$$")
|
||||
|| next.getName().endsWith("$"))) {
|
||||
paths.add(node.name + ".class");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
otherFiles.put(next.getName(), data);
|
||||
}
|
||||
} else {
|
||||
otherFiles.put(next.getName(), data);
|
||||
}
|
||||
}
|
||||
jar.close();
|
||||
refresh();
|
||||
} catch (Throwable e) {
|
||||
classNodes.clear();
|
||||
otherFiles.clear();
|
||||
e.printStackTrace();
|
||||
Main.showError(e);
|
||||
}
|
||||
}
|
||||
|
||||
private static int getSlashCount(String s) {
|
||||
int count = 0;
|
||||
for (char c : s.toCharArray()) {
|
||||
if (c == '/')
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
public void refresh() {
|
||||
setRoot(new ByteEditTreeNode(((ByteEditTreeNode) getRoot()).toString()));
|
||||
Collections.sort(paths, String.CASE_INSENSITIVE_ORDER);
|
||||
Collections.sort(paths, new Comparator<String>() {
|
||||
public int compare(String s1, String s2) {
|
||||
return getSlashCount(s2) - getSlashCount(s1);
|
||||
}
|
||||
});
|
||||
|
||||
// Windows-like sorting (like file explorer)
|
||||
List<String> tmp = new ArrayList<>(paths);
|
||||
|
||||
List<String> folders = tmp.stream().filter(s -> {
|
||||
int c = countSlashes(s, 50);
|
||||
return c > 0 && c < 50;
|
||||
}).map(s -> {
|
||||
int idx = s.lastIndexOf('/');
|
||||
if (idx == s.length() - 1)
|
||||
idx = s.lastIndexOf('/', idx - 1);
|
||||
if (idx == -1)
|
||||
return s;
|
||||
return s.substring(0, idx);
|
||||
}).distinct().sorted(new Comparator<String>() {
|
||||
@Override
|
||||
public int compare(String s, String s2) {
|
||||
// From String#compareToIgnoreCase(String)
|
||||
int n = s.length();
|
||||
int n2 = s2.length();
|
||||
int n3 = Math.min(n, n2);
|
||||
for (int i = 0; i < n3; ++i) {
|
||||
char c;
|
||||
char c2 = s.charAt(i);
|
||||
if (c2 == (c = s2.charAt(i)) || (c2 = Character.toUpperCase(c2)) == (c = Character.toUpperCase(c))
|
||||
|| (c2 = Character.toLowerCase(c2)) == (c = Character.toLowerCase(c)))
|
||||
continue;
|
||||
return c2 - c;
|
||||
}
|
||||
// Other way around
|
||||
return n2 - n;
|
||||
}
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
tmp.removeAll(folders);
|
||||
tmp.addAll(0, folders);
|
||||
|
||||
for (String s : tmp) {
|
||||
String[] elements = Main.patternSlash.split(s, 50);
|
||||
if (elements.length >= 50) {
|
||||
((ByteEditTreeNode) getRoot()).add(new ByteEditTreeNode(s, s));
|
||||
} else {
|
||||
ByteEditTreeNode currentNode = (ByteEditTreeNode) getRoot();
|
||||
for (int i = 0; i < elements.length; i++) {
|
||||
String token = elements[i];
|
||||
ByteEditTreeNode nextNode = findNode(currentNode, token);
|
||||
if (nextNode == null) {
|
||||
nextNode = new ByteEditTreeNode(token, s);
|
||||
currentNode.add(nextNode);
|
||||
}
|
||||
currentNode = nextNode;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static ByteEditTreeNode findNode(ByteEditTreeNode parent, String name) {
|
||||
Enumeration<?> e = parent.children();
|
||||
while (e.hasMoreElements()) {
|
||||
ByteEditTreeNode element = (ByteEditTreeNode) e.nextElement();
|
||||
if (element.getUserObject().equals(name)) {
|
||||
return element;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static int countSlashes(String s, int max) {
|
||||
int count = 0;
|
||||
for (char c : s.toCharArray()) {
|
||||
if (c == '/') {
|
||||
count++;
|
||||
if (count == max)
|
||||
break;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
private static byte[] toByteArray(final InputStream input) throws IOException {
|
||||
try (final ByteArrayOutputStream output = new ByteArrayOutputStream()) {
|
||||
byte[] buffer = new byte[4096];
|
||||
int read;
|
||||
while ((read = input.read(buffer)) != -1) {
|
||||
output.write(buffer, 0, read);
|
||||
}
|
||||
return output.toByteArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package me.ByteEdit.main;
|
||||
|
||||
import javax.swing.JTree;
|
||||
import javax.swing.event.TreeExpansionEvent;
|
||||
import javax.swing.event.TreeExpansionListener;
|
||||
import javax.swing.tree.TreeNode;
|
||||
import javax.swing.tree.TreePath;
|
||||
|
||||
public class FurtherExpandingTreeExpansionListener implements TreeExpansionListener {
|
||||
|
||||
private final JTree tree;
|
||||
|
||||
public FurtherExpandingTreeExpansionListener(JTree tree) {
|
||||
this.tree = tree;
|
||||
}
|
||||
|
||||
public void treeExpanded(TreeExpansionEvent event) {
|
||||
TreePath treePath = event.getPath();
|
||||
Object expandedTreePathObject = treePath.getLastPathComponent();
|
||||
if (!(expandedTreePathObject instanceof TreeNode))
|
||||
return;
|
||||
TreeNode expandedTreeNode = (TreeNode) expandedTreePathObject;
|
||||
if (expandedTreeNode.getChildCount() == 1) {
|
||||
TreeNode descendantTreeNode = expandedTreeNode.getChildAt(0);
|
||||
if (descendantTreeNode.isLeaf())
|
||||
return;
|
||||
TreePath nextTreePath = treePath.pathByAddingChild(descendantTreeNode);
|
||||
tree.expandPath(nextTreePath);
|
||||
}
|
||||
}
|
||||
|
||||
public void treeCollapsed(TreeExpansionEvent event) {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
package me.ByteEdit.main;
|
||||
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.StringReader;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
|
||||
import org.fife.ui.rtextarea.RTextArea;
|
||||
import org.fife.ui.rtextarea.ToolTipSupplier;
|
||||
|
||||
import me.ByteEdit.edit.Assembler;
|
||||
|
||||
public class HugeStringsToolTips implements ToolTipSupplier {
|
||||
|
||||
private final RSyntaxTextArea txtByteEditView;
|
||||
|
||||
public HugeStringsToolTips(RSyntaxTextArea txtByteEditView) {
|
||||
this.txtByteEditView = txtByteEditView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getToolTipText(RTextArea textArea, MouseEvent e) {
|
||||
int idx = textArea.viewToModel(e.getPoint());
|
||||
if (idx < 0)
|
||||
return null;
|
||||
int subIdx = Math.max(idx - 15, 0);
|
||||
int subLen = Math.min(30, textArea.getDocument().getLength() - subIdx);
|
||||
if (subLen <= 0)
|
||||
return null;
|
||||
try {
|
||||
String cut = textArea.getText(subIdx, subLen);
|
||||
int hashIdx = -1;
|
||||
for (int off = idx - subIdx; off >= 0; off--) {
|
||||
if (cut.charAt(off) == '#') {
|
||||
hashIdx = off;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (hashIdx < 0) {
|
||||
for (int off = idx - subIdx; off < cut.length(); off++) {
|
||||
if (cut.charAt(off) == '#') {
|
||||
hashIdx = off;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (hashIdx < 0)
|
||||
return null;
|
||||
if (hashIdx >= 5 && cut.substring(hashIdx - 5, hashIdx).equals("ldc \"")) // ldc "#..."
|
||||
return null;
|
||||
int numLen = 1;
|
||||
for (int i = hashIdx + 1; i < cut.length(); i++) {
|
||||
if (!(cut.charAt(i) - '0' >= 0 && cut.charAt(i) - '0' <= 9)) {
|
||||
break;
|
||||
}
|
||||
numLen++;
|
||||
}
|
||||
if (numLen < 2 || hashIdx > idx - subIdx || idx - subIdx - numLen >= hashIdx)
|
||||
return null;
|
||||
String hashNum = cut.substring(hashIdx, hashIdx + numLen);
|
||||
|
||||
String txt = txtByteEditView.getText();
|
||||
int len = 0;
|
||||
for (String asm : txt.split("\\/\\/ #Annotations:\n")) {
|
||||
len += 19; // "\\/\\/ #Annotations:\n".length()
|
||||
if (asm.isEmpty())
|
||||
continue;
|
||||
if (idx >= len && idx < len + asm.length()) {
|
||||
try (BufferedReader reader = new BufferedReader(new StringReader(asm))) {
|
||||
String s;
|
||||
while (!(s = reader.readLine()).startsWith("// #SourceFile: ")) {
|
||||
}
|
||||
while (!(s = reader.readLine()).equals("// #Fields")) {
|
||||
if (s.startsWith("#")) {
|
||||
String[] split = Assembler.SPACE.split(s, 2);
|
||||
if (hashNum.equals(split[0].substring(0, split[0].length() - 1))) {
|
||||
String toolTip = split[1];
|
||||
if (toolTip.length() > 500)
|
||||
toolTip = toolTip.substring(0, 500) + "...";
|
||||
return toolTip;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (IOException e1) {
|
||||
}
|
||||
break;
|
||||
}
|
||||
len += asm.length();
|
||||
}
|
||||
} catch (Exception e1) {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
+74
-362
@@ -20,26 +20,17 @@ import java.awt.event.ItemEvent;
|
||||
import java.awt.event.ItemListener;
|
||||
import java.awt.event.KeyAdapter;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.StringReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipFile;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
@@ -63,16 +54,10 @@ import javax.swing.JSplitPane;
|
||||
import javax.swing.JTree;
|
||||
import javax.swing.KeyStroke;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
import javax.swing.event.TreeExpansionEvent;
|
||||
import javax.swing.event.TreeExpansionListener;
|
||||
import javax.swing.event.TreeSelectionEvent;
|
||||
import javax.swing.event.TreeSelectionListener;
|
||||
import javax.swing.filechooser.FileNameExtensionFilter;
|
||||
import javax.swing.text.BadLocationException;
|
||||
import javax.swing.tree.DefaultTreeCellRenderer;
|
||||
import javax.swing.tree.DefaultTreeModel;
|
||||
import javax.swing.tree.TreeNode;
|
||||
import javax.swing.tree.TreePath;
|
||||
import javax.swing.tree.TreeSelectionModel;
|
||||
|
||||
import org.fife.ui.autocomplete.AutoCompletion;
|
||||
@@ -84,10 +69,7 @@ import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
|
||||
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
|
||||
import org.fife.ui.rsyntaxtextarea.folding.CurlyFoldParser;
|
||||
import org.fife.ui.rsyntaxtextarea.folding.FoldParserManager;
|
||||
import org.fife.ui.rtextarea.RTextArea;
|
||||
import org.fife.ui.rtextarea.RTextScrollPane;
|
||||
import org.fife.ui.rtextarea.ToolTipSupplier;
|
||||
import org.objectweb.asm.ClassReader;
|
||||
import org.objectweb.asm.ClassWriter;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
import org.objectweb.asm.tree.MethodNode;
|
||||
@@ -107,14 +89,22 @@ import me.ByteEdit.utils.ClassUtil;
|
||||
import me.ByteEdit.utils.OpcodesReverse;
|
||||
import me.ByteEdit.utils.UnicodeUtils;
|
||||
|
||||
// ASM 9.2
|
||||
public class Main extends JFrame {
|
||||
|
||||
public static Main INSTANCE;
|
||||
|
||||
public static final Pattern patternSlash = Pattern.compile("/");
|
||||
private static final Pattern patternRenameableField = Pattern
|
||||
.compile("^\t(?:[a-z]+ |0x[0-9a-fA-F]+ )*?(\\[*(?:V|Z|C|B|S|I|F|J|D|L.+?;)) ([^ ]+) ?.*");
|
||||
private static final Pattern patternRenameableMethod = Pattern
|
||||
.compile("^\t(?:[a-z]+ |0x[0-9a-fA-F]+ )*?([^ ]+) (\\((?:\\[*(?:V|Z|C|B|S|I|F|J|D|L.+?;))*\\)[^ ]+) .*\\{");
|
||||
|
||||
private JPanel contentPane;
|
||||
private volatile boolean isChangingFile;
|
||||
public static File jarFile;
|
||||
public static HashMap<String, byte[]> OTHER_FILES = new HashMap<>();
|
||||
public static HashMap<String, ClassNode> classNodes = new HashMap<>();
|
||||
public static final HashMap<String, ClassNode> classNodes = new HashMap<>();
|
||||
public static final HashMap<String, byte[]> otherFiles = new HashMap<>();
|
||||
public static String currentNodeName;
|
||||
public static RSyntaxTextArea txtByteEditView;
|
||||
public static GlobalSearchBox globalSearchBox;
|
||||
@@ -128,7 +118,6 @@ public class Main extends JFrame {
|
||||
public static RTextScrollPane scrollPane_ByteEdit;
|
||||
public static File saveFolder;
|
||||
|
||||
private static final Pattern SLASH = Pattern.compile("/");
|
||||
private JMenuBar menuBar;
|
||||
private JMenu mnFile;
|
||||
private JMenuItem mntmOpenJar;
|
||||
@@ -154,10 +143,12 @@ public class Main extends JFrame {
|
||||
private JMenuItem rdbtnmntm10000;
|
||||
public JCheckBoxMenuItem mntmMultithreaded;
|
||||
private JMenu mnDeobfuscation;
|
||||
public JCheckBoxMenuItem mntmNumbers;
|
||||
public JCheckBoxMenuItem mntmNumbers, mntmNops;
|
||||
|
||||
public static final Object treeLock = new Object();
|
||||
|
||||
public static EnumDecompiler decompiler = EnumDecompiler.BYTEEDIT;
|
||||
|
||||
/**
|
||||
* Launch the application.
|
||||
*/
|
||||
@@ -176,7 +167,7 @@ public class Main extends JFrame {
|
||||
/**
|
||||
* Create a simple provider that adds some Java-related completions.
|
||||
*/
|
||||
private CompletionProvider createCompletionProvider() {
|
||||
private static CompletionProvider createCompletionProvider() {
|
||||
DefaultCompletionProvider provider = new DefaultCompletionProvider();
|
||||
for (int i = 0; i < 200; i++) {
|
||||
String s = OpcodesReverse.reverseOpcode(i);
|
||||
@@ -298,7 +289,6 @@ public class Main extends JFrame {
|
||||
if (action == 0) {
|
||||
final File file = fileChooser.getSelectedFile();
|
||||
saveFolder = file.getParentFile();
|
||||
boolean shouldSave = false;
|
||||
if (file.exists()) {
|
||||
synchronized (treeLock) {
|
||||
jarFile = file;
|
||||
@@ -312,8 +302,9 @@ public class Main extends JFrame {
|
||||
new Thread(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
ArchiveTreeModel model = new ArchiveTreeModel(new ZipFile(jarFile));
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
ArchiveTreeModel model = new ArchiveTreeModel(new ZipFile(jarFile), classNodes,
|
||||
otherFiles);
|
||||
EventQueue.invokeAndWait(new Runnable() {
|
||||
public void run() {
|
||||
synchronized (treeLock) {
|
||||
tree.setModel(model);
|
||||
@@ -330,7 +321,7 @@ public class Main extends JFrame {
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (IOException e) {
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@@ -435,6 +426,9 @@ public class Main extends JFrame {
|
||||
mntmNumbers = new JCheckBoxMenuItem("Numbers");
|
||||
mnDeobfuscation.add(mntmNumbers);
|
||||
|
||||
mntmNops = new JCheckBoxMenuItem("Nops");
|
||||
mnDeobfuscation.add(mntmNops);
|
||||
|
||||
contentPane = new JPanel();
|
||||
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
|
||||
setContentPane(contentPane);
|
||||
@@ -451,7 +445,7 @@ public class Main extends JFrame {
|
||||
new CurlyFoldParser(false, true));
|
||||
tree = new JTree(new DefaultTreeModel(null));
|
||||
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
|
||||
tree.addTreeExpansionListener(new FurtherExpandingTreeExpansionListener());
|
||||
tree.addTreeExpansionListener(new FurtherExpandingTreeExpansionListener(tree));
|
||||
tree.addKeyListener(new KeyAdapter() {
|
||||
@Override
|
||||
public void keyReleased(KeyEvent e) {
|
||||
@@ -466,8 +460,9 @@ public class Main extends JFrame {
|
||||
new Thread(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
ArchiveTreeModel model = new ArchiveTreeModel(new ZipFile(jarFile));
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
ArchiveTreeModel model = new ArchiveTreeModel(new ZipFile(jarFile), classNodes,
|
||||
otherFiles);
|
||||
EventQueue.invokeAndWait(new Runnable() {
|
||||
public void run() {
|
||||
synchronized (treeLock) {
|
||||
tree.setModel(model);
|
||||
@@ -476,7 +471,7 @@ public class Main extends JFrame {
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (IOException e) {
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@@ -492,19 +487,19 @@ public class Main extends JFrame {
|
||||
String s = ((ByteEditTreeNode) tree.getSelectionPath().getLastPathComponent()).path;
|
||||
if (JOptionPane.showConfirmDialog(INSTANCE, "Do you want to delete\n\"" + s + "\"?", "Delete",
|
||||
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
|
||||
String substr = s.substring(0, s.length() - 6);
|
||||
s = s.substring(0, s.length() - 6);
|
||||
ArrayList<String> toRemove = new ArrayList<>();
|
||||
for (String key : Main.classNodes.keySet()) {
|
||||
if (key.contains("$")) {
|
||||
String[] split = key.split("\\$");
|
||||
if (split[0].equals(substr)) {
|
||||
if (split[0].equals(s)) {
|
||||
toRemove.add(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
ArchiveTreeModel model = (ArchiveTreeModel) tree.getModel();
|
||||
classNodes.remove(s);
|
||||
model.paths.remove(s);
|
||||
model.paths.remove(s + ".class");
|
||||
for (String rem : toRemove) {
|
||||
classNodes.remove(rem);
|
||||
}
|
||||
@@ -521,17 +516,8 @@ public class Main extends JFrame {
|
||||
}
|
||||
});
|
||||
scrollPane.setViewportView(tree);
|
||||
tree.addTreeSelectionListener(new TreeSelectionListener() {
|
||||
|
||||
public void valueChanged(TreeSelectionEvent e) {
|
||||
synchronized (treeLock) {
|
||||
if (!isChangingFile) {
|
||||
SingleThreadedExecutor.execute(
|
||||
() -> selectFile(((ByteEditTreeNode) e.getPath().getLastPathComponent()).path));
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
tree.addTreeSelectionListener(e -> SingleThreadedExecutor
|
||||
.submit(() -> selectFile(((ByteEditTreeNode) e.getPath().getLastPathComponent()).path)));
|
||||
new DropTarget(tree, new DropTargetListener() {
|
||||
|
||||
@Override
|
||||
@@ -561,8 +547,9 @@ public class Main extends JFrame {
|
||||
new Thread(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
ArchiveTreeModel model = new ArchiveTreeModel(new ZipFile(jarFile));
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
ArchiveTreeModel model = new ArchiveTreeModel(new ZipFile(jarFile),
|
||||
classNodes, otherFiles);
|
||||
EventQueue.invokeAndWait(new Runnable() {
|
||||
public void run() {
|
||||
synchronized (treeLock) {
|
||||
tree.setModel(model);
|
||||
@@ -579,7 +566,7 @@ public class Main extends JFrame {
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (IOException e) {
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@@ -618,89 +605,12 @@ public class Main extends JFrame {
|
||||
txtByteEditView = new RSyntaxTextArea();
|
||||
ac.install(txtByteEditView);
|
||||
txtByteEditView.setCodeFoldingEnabled(true);
|
||||
// ToolTips for HugeStrings
|
||||
txtByteEditView.setToolTipSupplier(new ToolTipSupplier() {
|
||||
|
||||
@Override
|
||||
public String getToolTipText(RTextArea textArea, MouseEvent e) {
|
||||
int idx = textArea.viewToModel(e.getPoint());
|
||||
if (idx < 0)
|
||||
return null;
|
||||
int subIdx = Math.max(idx - 15, 0);
|
||||
int subLen = Math.min(30, textArea.getDocument().getLength() - subIdx);
|
||||
if (subLen <= 0)
|
||||
return null;
|
||||
try {
|
||||
String cut = textArea.getText(subIdx, subLen);
|
||||
int hashIdx = -1;
|
||||
for (int off = idx - subIdx; off >= 0; off--) {
|
||||
if (cut.charAt(off) == '#') {
|
||||
hashIdx = off;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (hashIdx < 0) {
|
||||
for (int off = idx - subIdx; off < cut.length(); off++) {
|
||||
if (cut.charAt(off) == '#') {
|
||||
hashIdx = off;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (hashIdx < 0)
|
||||
return null;
|
||||
if (hashIdx >= 5 && cut.substring(hashIdx - 5, hashIdx).equals("ldc \"")) // ldc "#..."
|
||||
return null;
|
||||
int numLen = 1;
|
||||
for (int i = hashIdx + 1; i < cut.length(); i++) {
|
||||
if (!(cut.charAt(i) - '0' >= 0 && cut.charAt(i) - '0' <= 9)) {
|
||||
break;
|
||||
}
|
||||
numLen++;
|
||||
}
|
||||
if (numLen < 2 || hashIdx > idx - subIdx || idx - subIdx - numLen >= hashIdx)
|
||||
return null;
|
||||
String hashNum = cut.substring(hashIdx, hashIdx + numLen);
|
||||
|
||||
String txt = txtByteEditView.getText();
|
||||
int len = 0;
|
||||
for (String asm : txt.split("\\/\\/ #Annotations:\n")) {
|
||||
len += 19; // "\\/\\/ #Annotations:\n".length()
|
||||
if (asm.isEmpty())
|
||||
continue;
|
||||
if (idx >= len && idx < len + asm.length()) {
|
||||
try (BufferedReader reader = new BufferedReader(new StringReader(asm))) {
|
||||
String s;
|
||||
while (!(s = reader.readLine()).startsWith("// #SourceFile: ")) {
|
||||
}
|
||||
while (!(s = reader.readLine()).equals("// #Fields")) {
|
||||
if (s.startsWith("#")) {
|
||||
String[] split = Assembler.SPACE.split(s, 2);
|
||||
if (hashNum.equals(split[0].substring(0, split[0].length() - 1))) {
|
||||
String toolTip = split[1];
|
||||
if (toolTip.length() > 500)
|
||||
toolTip = toolTip.substring(0, 500) + "...";
|
||||
return toolTip;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (IOException e1) {
|
||||
}
|
||||
break;
|
||||
} else {
|
||||
len += asm.length();
|
||||
}
|
||||
}
|
||||
} catch (Exception e1) {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
});
|
||||
txtByteEditView.setToolTipSupplier(new HugeStringsToolTips(txtByteEditView));
|
||||
txtByteEditView.addKeyListener(new KeyAdapter() {
|
||||
@Override
|
||||
public void keyReleased(KeyEvent e) {
|
||||
if (e.getKeyCode() == 116 && currentNodeName != null) { // F5
|
||||
SingleThreadedExecutor.execute(Main::decompileCurrentNode);
|
||||
SingleThreadedExecutor.submit(Main::decompileCurrentNode);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -737,47 +647,41 @@ public class Main extends JFrame {
|
||||
// specific
|
||||
tree.registerKeyboardAction(e -> save(), ctrlS, JComponent.WHEN_FOCUSED);
|
||||
txtByteEditView.registerKeyboardAction(e -> saveCurrentClassNode(), ctrlS, JComponent.WHEN_FOCUSED);
|
||||
txtByteEditView.registerKeyboardAction(e -> {
|
||||
try {
|
||||
renameSelected();
|
||||
} catch (BadLocationException e1) {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
}, ctrlR, JComponent.WHEN_FOCUSED);
|
||||
txtByteEditView.registerKeyboardAction(e -> renameSelected(), ctrlR, JComponent.WHEN_FOCUSED);
|
||||
txtByteEditView.setEditable(true);
|
||||
txtByteEditView.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA_DISASSEMBLE);
|
||||
txtByteEditView.setCodeFoldingEnabled(true);
|
||||
scrollPane_ByteEdit = new RTextScrollPane();
|
||||
ThemeManager.registerTextArea(txtByteEditView);
|
||||
JPanel panel = new JPanel(new BorderLayout());
|
||||
|
||||
JPanel panel = new JPanel(new BorderLayout());
|
||||
panel.add(scrollPane_ByteEdit, BorderLayout.CENTER);
|
||||
final JComboBox<String> decompilerMode = new JComboBox<>();
|
||||
DefaultComboBoxModel model = new DefaultComboBoxModel();
|
||||
Arrays.stream(EnumDecompiler.values()).forEach(model::addElement);
|
||||
Stream.of(EnumDecompiler.values()).forEach(model::addElement);
|
||||
decompilerMode.setModel(model);
|
||||
decompilerMode.addItemListener(new ItemListener() {
|
||||
@Override
|
||||
public void itemStateChanged(ItemEvent e) {
|
||||
if (e.getStateChange() == ItemEvent.SELECTED) {
|
||||
EnumDecompiler selected = (EnumDecompiler) e.getItem();
|
||||
SingleThreadedExecutor.execute(() -> {
|
||||
SingleThreadedExecutor.submit(() -> {
|
||||
decompiler = selected;
|
||||
if (currentNodeName != null) {
|
||||
decompileCurrentNode();
|
||||
try {
|
||||
EventQueue.invokeAndWait(() -> {
|
||||
synchronized (treeLock) {
|
||||
txtByteEditView.setCaretPosition(0);
|
||||
try {
|
||||
txtByteEditView.setSyntaxEditingStyle(decompiler.getSyntaxStyle());
|
||||
} catch (Throwable t) {
|
||||
}
|
||||
txtByteEditView.setEditable(decompiler.isEditable());
|
||||
}
|
||||
});
|
||||
} catch (Exception e1) {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -790,22 +694,16 @@ public class Main extends JFrame {
|
||||
scrollPane_ByteEdit.setFoldIndicatorEnabled(true);
|
||||
}
|
||||
|
||||
public static EnumDecompiler decompiler = EnumDecompiler.BYTEEDIT;
|
||||
|
||||
private final Pattern renameableFieldPattern = Pattern
|
||||
.compile("^\t(?:[a-z]+ |0x[0-9a-fA-F]+ )*?(\\[*(?:V|Z|C|B|S|I|F|J|D|L.+?;)) ([^ ]+) ?.*");
|
||||
private final Pattern renameableMethodPattern = Pattern
|
||||
.compile("^\t(?:[a-z]+ |0x[0-9a-fA-F]+ )*?([^ ]+) (\\((?:\\[*(?:V|Z|C|B|S|I|F|J|D|L.+?;))*\\)[^ ]+) .*\\{");
|
||||
|
||||
public void renameSelected() throws BadLocationException {
|
||||
public void renameSelected() {
|
||||
try {
|
||||
int lineStart = txtByteEditView.getLineStartOffsetOfCurrentLine();
|
||||
int lineEnd = txtByteEditView.getLineEndOffsetOfCurrentLine() - 1;
|
||||
String line = txtByteEditView.getText(lineStart, lineEnd - lineStart);
|
||||
Matcher m = renameableFieldPattern.matcher(line);
|
||||
Matcher m = patternRenameableField.matcher(line);
|
||||
if (m.find()) {
|
||||
setRenameInfo(m, lineEnd);
|
||||
} else {
|
||||
m = renameableMethodPattern.matcher(line);
|
||||
m = patternRenameableMethod.matcher(line);
|
||||
if (m.find()) {
|
||||
if (ClassUtil.isObjectClassMethod(m.group(1), m.group(2), false)) {
|
||||
JOptionPane.showMessageDialog(null, "This method can not be renamed!", "Error!",
|
||||
@@ -815,6 +713,9 @@ public class Main extends JFrame {
|
||||
setRenameInfo(m, lineEnd);
|
||||
}
|
||||
}
|
||||
} catch (BadLocationException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void setRenameInfo(Matcher m, int lineEnd) throws BadLocationException {
|
||||
@@ -838,9 +739,9 @@ public class Main extends JFrame {
|
||||
String[] split = s.split(" ");
|
||||
String className = UnicodeUtils.unescape(null, split[split.length - 1], true);
|
||||
renameBox.className = className;
|
||||
String name = UnicodeUtils.unescape(null, m.pattern() == renameableFieldPattern ? m.group(2) : m.group(1),
|
||||
String name = UnicodeUtils.unescape(null, m.pattern() == patternRenameableField ? m.group(2) : m.group(1),
|
||||
true);
|
||||
String desc = UnicodeUtils.unescape(null, m.pattern() == renameableFieldPattern ? m.group(1) : m.group(2),
|
||||
String desc = UnicodeUtils.unescape(null, m.pattern() == patternRenameableField ? m.group(1) : m.group(2),
|
||||
true);
|
||||
renameBox.name = name;
|
||||
renameBox.desc = desc;
|
||||
@@ -851,7 +752,7 @@ public class Main extends JFrame {
|
||||
}
|
||||
}
|
||||
|
||||
private void saveCurrentClassNode() {
|
||||
private static void saveCurrentClassNode() {
|
||||
String txt = txtByteEditView.getText();
|
||||
for (String s : txt.split("\\/\\/ #Annotations:\n")) {
|
||||
if (s.isEmpty())
|
||||
@@ -860,15 +761,15 @@ public class Main extends JFrame {
|
||||
if (node == null) {
|
||||
continue;
|
||||
}
|
||||
if (classNodes.replace(getFullName(node.name), node) == null) {
|
||||
classNodes.put(getFullName(node.name), node);
|
||||
if (classNodes.replace(node.name, node) == null) {
|
||||
classNodes.put(node.name, node);
|
||||
ArchiveTreeModel model;
|
||||
if (tree.getModel().getClass().equals(DefaultTreeModel.class)) {
|
||||
tree.setModel(model = new ArchiveTreeModel());
|
||||
tree.setModel(model = new ArchiveTreeModel(classNodes, otherFiles));
|
||||
} else {
|
||||
model = (ArchiveTreeModel) tree.getModel();
|
||||
}
|
||||
String name = getFullName(node.name);
|
||||
String name = node.name + ".class";
|
||||
if (name.contains("/") ? (!name.split("/")[name.split("/").length - 1].contains("$"))
|
||||
: (!name.contains("$"))) {
|
||||
model.paths.add(name);
|
||||
@@ -882,26 +783,21 @@ public class Main extends JFrame {
|
||||
}
|
||||
|
||||
public static void decompileCurrentNode() {
|
||||
if (currentNodeName == null)
|
||||
return;
|
||||
try {
|
||||
EnumDecompiler decompiler = Main.decompiler;
|
||||
String current = currentNodeName;
|
||||
ClassNode classNode = classNodes.get(current);
|
||||
int prev = txtByteEditView.getCaretPosition();
|
||||
String dis = decompiler.getDecompiler().decompile(classNode);
|
||||
String substr = current.substring(0, current.length() - 6);
|
||||
synchronized (Main.classNodes) {
|
||||
for (String key : Main.classNodes.keySet()) {
|
||||
if (key.contains("$")) {
|
||||
String[] split = key.split("\\$");
|
||||
if (split[0].equals(substr)) {
|
||||
dis += "\n" + decompiler.getDecompiler().decompile(classNodes.get(key));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
String dis = decompiler.getDecompiler().decompile(classNode, Main.classNodes);
|
||||
EventQueue.invokeAndWait(() -> {
|
||||
synchronized (treeLock) {
|
||||
txtByteEditView.setText(dis);
|
||||
if (dis.length() > prev)
|
||||
txtByteEditView.setCaretPosition(prev);
|
||||
}
|
||||
});
|
||||
} catch (Exception e2) {
|
||||
e2.printStackTrace();
|
||||
}
|
||||
@@ -909,6 +805,7 @@ public class Main extends JFrame {
|
||||
|
||||
public static void selectFile(String s) {
|
||||
if (s != null && s.endsWith(".class")) {
|
||||
s = s.substring(0, s.length() - 6);
|
||||
currentNodeName = s;
|
||||
decompileCurrentNode();
|
||||
txtByteEditView.setCaretPosition(0);
|
||||
@@ -960,14 +857,16 @@ public class Main extends JFrame {
|
||||
public void run() {
|
||||
synchronized (treeLock) {
|
||||
save(file, classNodes.values());
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
try {
|
||||
EventQueue.invokeAndWait(new Runnable() {
|
||||
public void run() {
|
||||
synchronized (treeLock) {
|
||||
isChangingFile = false;
|
||||
Main.this.setTitle("ByteEdit");
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
@@ -1000,12 +899,12 @@ public class Main extends JFrame {
|
||||
if (name != null && !name.isEmpty()) {
|
||||
String val = "Manifest-Version: 1.0\n" + "Class-Path: .\n" + "Main-Class: " + name.replace('/', '.')
|
||||
+ "\n\n";
|
||||
OTHER_FILES.put("META-INF/MANIFEST.MF", val.getBytes());
|
||||
otherFiles.put("META-INF/MANIFEST.MF", val.getBytes());
|
||||
}
|
||||
if (tree.getModel() instanceof ArchiveTreeModel)
|
||||
((ArchiveTreeModel) tree.getModel()).newCreated = false;
|
||||
}
|
||||
for (Entry<String, byte[]> entry : OTHER_FILES.entrySet()) {
|
||||
for (Entry<String, byte[]> entry : otherFiles.entrySet()) {
|
||||
ZipEntry ent = new ZipEntry(entry.getKey());
|
||||
output.putNextEntry(ent);
|
||||
output.write(entry.getValue());
|
||||
@@ -1021,7 +920,7 @@ public class Main extends JFrame {
|
||||
for (ClassNode node : classes) {
|
||||
ClassWriter writer = new ClassWriter(computeFlags);
|
||||
node.accept(writer);
|
||||
output.putNextEntry(new ZipEntry(getFullName(node.name)));
|
||||
output.putNextEntry(new ZipEntry(node.name + ".class"));
|
||||
output.write(writer.toByteArray());
|
||||
output.closeEntry();
|
||||
}
|
||||
@@ -1047,191 +946,4 @@ public class Main extends JFrame {
|
||||
public static void showError(String s) {
|
||||
JOptionPane.showMessageDialog(INSTANCE, s, "Error!", JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
|
||||
public static String getFullName(String s) {
|
||||
return s + ".class";
|
||||
}
|
||||
|
||||
class ArchiveTreeModel extends DefaultTreeModel {
|
||||
|
||||
public ArrayList<String> paths = new ArrayList<>();
|
||||
public boolean newCreated = false;
|
||||
|
||||
public ArchiveTreeModel() {
|
||||
super(new ByteEditTreeNode("New"));
|
||||
newCreated = true;
|
||||
}
|
||||
|
||||
public ArchiveTreeModel(ZipFile jar) {
|
||||
super(new ByteEditTreeNode(jar.getName().split(File.separator.equals("\\") ? "\\\\"
|
||||
: File.separator)[jar.getName().split(File.separator.equals("\\") ? "\\\\" : File.separator).length
|
||||
- 1]));
|
||||
try {
|
||||
classNodes.clear();
|
||||
OTHER_FILES.clear();
|
||||
Enumeration<? extends ZipEntry> enumeration = jar.entries();
|
||||
while (enumeration.hasMoreElements()) {
|
||||
ZipEntry next = enumeration.nextElement();
|
||||
byte[] data = toByteArray(jar.getInputStream(next));
|
||||
if (next.getSize() != 0 && !next.getName().startsWith("META-INF")
|
||||
&& (next.getName().endsWith(".class") || next.getName().endsWith(".class/"))) {
|
||||
try {
|
||||
ClassReader reader = new ClassReader(data);
|
||||
ClassNode node = new ClassNode();
|
||||
reader.accept(node, 0);
|
||||
classNodes.put(getFullName(node.name), node);
|
||||
|
||||
if ((next.getName().contains("/")
|
||||
? (!SLASH.split(next.getName())[SLASH.split(next.getName()).length - 1]
|
||||
.contains("$"))
|
||||
: (!next.getName().contains("$")))
|
||||
|| (next.getName().startsWith("$") || next.getName().contains("$$")
|
||||
|| next.getName().endsWith("$"))) {
|
||||
paths.add(getFullName(node.name));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
OTHER_FILES.put(next.getName(), data);
|
||||
}
|
||||
} else {
|
||||
OTHER_FILES.put(next.getName(), data);
|
||||
}
|
||||
}
|
||||
jar.close();
|
||||
refresh();
|
||||
} catch (Throwable e) {
|
||||
classNodes.clear();
|
||||
OTHER_FILES.clear();
|
||||
e.printStackTrace();
|
||||
showError(e);
|
||||
}
|
||||
}
|
||||
|
||||
private int getSlashCount(String s) {
|
||||
int count = 0;
|
||||
for (char c : s.toCharArray()) {
|
||||
if (c == '/')
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
public void refresh() {
|
||||
setRoot(new ByteEditTreeNode(((ByteEditTreeNode) getRoot()).toString()));
|
||||
Collections.sort(paths, String.CASE_INSENSITIVE_ORDER);
|
||||
Collections.sort(paths, new Comparator<String>() {
|
||||
public int compare(String s1, String s2) {
|
||||
return getSlashCount(s2) - getSlashCount(s1);
|
||||
}
|
||||
});
|
||||
|
||||
// Windows-like sorting (like file explorer)
|
||||
List<String> tmp = new ArrayList<>(paths);
|
||||
|
||||
List<String> folders = tmp.stream().filter(s -> {
|
||||
int c = countSlashes(s, 50);
|
||||
return c > 0 && c < 50;
|
||||
}).map(s -> {
|
||||
int idx = s.lastIndexOf('/');
|
||||
if (idx == s.length() - 1)
|
||||
idx = s.lastIndexOf('/', idx - 1);
|
||||
if (idx == -1)
|
||||
return s;
|
||||
return s.substring(0, idx);
|
||||
}).distinct().sorted(new Comparator<String>() {
|
||||
@Override
|
||||
public int compare(String s, String s2) {
|
||||
// From String#compareToIgnoreCase(String)
|
||||
int n = s.length();
|
||||
int n2 = s2.length();
|
||||
int n3 = Math.min(n, n2);
|
||||
for (int i = 0; i < n3; ++i) {
|
||||
char c;
|
||||
char c2 = s.charAt(i);
|
||||
if (c2 == (c = s2.charAt(i))
|
||||
|| (c2 = Character.toUpperCase(c2)) == (c = Character.toUpperCase(c))
|
||||
|| (c2 = Character.toLowerCase(c2)) == (c = Character.toLowerCase(c)))
|
||||
continue;
|
||||
return c2 - c;
|
||||
}
|
||||
// Other way around
|
||||
return n2 - n;
|
||||
}
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
tmp.removeAll(folders);
|
||||
tmp.addAll(0, folders);
|
||||
|
||||
for (String s : tmp) {
|
||||
String[] elements = SLASH.split(s, 50);
|
||||
if (elements.length >= 50) {
|
||||
((ByteEditTreeNode) getRoot()).add(new ByteEditTreeNode(s, s));
|
||||
} else {
|
||||
ByteEditTreeNode currentNode = (ByteEditTreeNode) getRoot();
|
||||
for (int i = 0; i < elements.length; i++) {
|
||||
String token = elements[i];
|
||||
ByteEditTreeNode nextNode = findNode(currentNode, token);
|
||||
if (nextNode == null) {
|
||||
nextNode = new ByteEditTreeNode(token, s);
|
||||
currentNode.add(nextNode);
|
||||
}
|
||||
currentNode = nextNode;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ByteEditTreeNode findNode(ByteEditTreeNode parent, String name) {
|
||||
Enumeration<?> e = parent.children();
|
||||
while (e.hasMoreElements()) {
|
||||
ByteEditTreeNode element = (ByteEditTreeNode) e.nextElement();
|
||||
if (element.getUserObject().equals(name)) {
|
||||
return element;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private int countSlashes(String s, int max) {
|
||||
int count = 0;
|
||||
for (char c : s.toCharArray()) {
|
||||
if (c == '/') {
|
||||
count++;
|
||||
if (count == max)
|
||||
break;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
}
|
||||
|
||||
private static class FurtherExpandingTreeExpansionListener implements TreeExpansionListener {
|
||||
public void treeExpanded(TreeExpansionEvent event) {
|
||||
TreePath treePath = event.getPath();
|
||||
Object expandedTreePathObject = treePath.getLastPathComponent();
|
||||
if (!(expandedTreePathObject instanceof TreeNode))
|
||||
return;
|
||||
TreeNode expandedTreeNode = (TreeNode) expandedTreePathObject;
|
||||
if (expandedTreeNode.getChildCount() == 1) {
|
||||
TreeNode descendantTreeNode = expandedTreeNode.getChildAt(0);
|
||||
if (descendantTreeNode.isLeaf())
|
||||
return;
|
||||
TreePath nextTreePath = treePath.pathByAddingChild(descendantTreeNode);
|
||||
tree.expandPath(nextTreePath);
|
||||
}
|
||||
}
|
||||
|
||||
public void treeCollapsed(TreeExpansionEvent event) {
|
||||
}
|
||||
}
|
||||
|
||||
public static byte[] toByteArray(final InputStream input) throws IOException {
|
||||
try (final ByteArrayOutputStream output = new ByteArrayOutputStream()) {
|
||||
byte[] buffer = new byte[4096];
|
||||
int read;
|
||||
while ((read = input.read(buffer)) != -1) {
|
||||
output.write(buffer, 0, read);
|
||||
}
|
||||
return output.toByteArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -320,12 +320,10 @@ public class ClassUtil {
|
||||
s += "enum ";
|
||||
acc ^= ACC_ENUM;
|
||||
}
|
||||
if (acc == access) {
|
||||
if (acc == access)
|
||||
return s;
|
||||
} else {
|
||||
return "0x" + Integer.toHexString(access) + " ";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return { JavaType, Import }
|
||||
@@ -544,7 +542,6 @@ public class ClassUtil {
|
||||
DecompilationInterface di = diMap.get(o.getClass());
|
||||
if (di != null)
|
||||
return di.apply(o, desc, escapeSpaces, hs);
|
||||
else
|
||||
return o.toString();
|
||||
}
|
||||
|
||||
|
||||
@@ -84,12 +84,10 @@ public class UnicodeUtils {
|
||||
sb.append(c);
|
||||
}
|
||||
if (stage != 0) {
|
||||
if (unicodeBuffer != 0) {
|
||||
if (unicodeBuffer != 0)
|
||||
throw new IllegalArgumentException("The unicode at the end is incomplete.");
|
||||
} else {
|
||||
throw new IllegalArgumentException("'\\' at the end is invalid.");
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,495 +0,0 @@
|
||||
/*
|
||||
* 04/27/2010
|
||||
*
|
||||
* ActionScriptTokenMaker.java - Scanner for ActionScript.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for the ActionScript.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>ActionScriptTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class ActionScriptTokenMaker
|
||||
%extends AbstractJFlexCTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public ActionScriptTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addHyperlinkToken(int, int, int)
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
* @param hyperlink Whether this token is a hyperlink.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType,
|
||||
int startOffset, boolean hyperlink) {
|
||||
super.addToken(array, start,end, tokenType, startOffset, hyperlink);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "//", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.COMMENT_MULTILINE:
|
||||
state = MLC;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Letter = [A-Za-z]
|
||||
LetterOrUnderscore = ({Letter}|"_")
|
||||
NonzeroDigit = [1-9]
|
||||
Digit = ("0"|{NonzeroDigit})
|
||||
HexDigit = ({Digit}|[A-Fa-f])
|
||||
OctalDigit = ([0-7])
|
||||
AnyCharacterButApostropheOrBackSlash = ([^\\'])
|
||||
AnyCharacterButDoubleQuoteOrBackSlash = ([^\\\"\n])
|
||||
EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
|
||||
Escape = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
|
||||
NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
|
||||
IdentifierStart = ({LetterOrUnderscore}|"$")
|
||||
IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
|
||||
|
||||
LineTerminator = (\n)
|
||||
WhiteSpace = ([ \t\f])
|
||||
|
||||
CharLiteral = ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})*[\'])
|
||||
UnclosedCharLiteral = ([\']([\\].|[^\\\'])*[^\']*)
|
||||
ErrorCharLiteral = ({UnclosedCharLiteral}[\'])
|
||||
StringLiteral = ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
|
||||
UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
|
||||
ErrorStringLiteral = ({UnclosedStringLiteral}[\"])
|
||||
|
||||
MLCBegin = ("/*")
|
||||
MLCEnd = ("*/")
|
||||
LineCommentBegin = ("//")
|
||||
IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
|
||||
IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
|
||||
IntegerLiteral = ({IntegerHelper1}[lL]?)
|
||||
HexLiteral = ({IntegerHelper2}[lL]?)
|
||||
FloatHelper1 = ([fFdD]?)
|
||||
FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
|
||||
FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
|
||||
FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
|
||||
FloatLiteral3 = ({Digit}+{FloatHelper2})
|
||||
FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
|
||||
ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
|
||||
BooleanLiteral = ("true"|"false")
|
||||
|
||||
Separator = ([\(\)\{\}\[\]])
|
||||
Separator2 = ([\;,.])
|
||||
|
||||
NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
|
||||
AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
|
||||
Operator = ({NonAssignmentOperator}|{AssignmentOperator})
|
||||
|
||||
Identifier = ({IdentifierStart}{IdentifierPart}*)
|
||||
ErrorIdentifier = ({NonSeparator}+)
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$]|{Letter}|{Digit})
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
|
||||
%state MLC
|
||||
%state EOL_COMMENT
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
/* Keywords */
|
||||
"add" |
|
||||
"and" |
|
||||
"break" |
|
||||
"case" |
|
||||
"catch" |
|
||||
"class" |
|
||||
"const" |
|
||||
"continue" |
|
||||
"default" |
|
||||
"delete" |
|
||||
"do" |
|
||||
"dynamic" |
|
||||
"else" |
|
||||
"eq" |
|
||||
"extends" |
|
||||
"final" |
|
||||
"finally" |
|
||||
"for" |
|
||||
"for each" |
|
||||
"function" |
|
||||
"ge" |
|
||||
"get" |
|
||||
"gt" |
|
||||
"if" |
|
||||
"ifFrameLoaded" |
|
||||
"implements" |
|
||||
"import" |
|
||||
"in" |
|
||||
"include" |
|
||||
"interface" |
|
||||
"internal" |
|
||||
"label" |
|
||||
"le" |
|
||||
"lt" |
|
||||
"namespace" |
|
||||
"native" |
|
||||
"ne" |
|
||||
"new" |
|
||||
"not" |
|
||||
"on" |
|
||||
"onClipEvent" |
|
||||
"or" |
|
||||
"override" |
|
||||
"package" |
|
||||
"private" |
|
||||
"protected" |
|
||||
"public" |
|
||||
"return" |
|
||||
"set" |
|
||||
"static" |
|
||||
"super" |
|
||||
"switch" |
|
||||
"tellTarget" |
|
||||
"this" |
|
||||
"throw" |
|
||||
"try" |
|
||||
"typeof" |
|
||||
"use" |
|
||||
"var" |
|
||||
"void" |
|
||||
"while" |
|
||||
"with" |
|
||||
|
||||
"null" |
|
||||
"undefined" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
/* Built-in objects (good idea not to use these names!) */
|
||||
"Array" |
|
||||
"Boolean" |
|
||||
"Color" |
|
||||
"Date" |
|
||||
"Function" |
|
||||
"int" |
|
||||
"Key" |
|
||||
"MovieClip" |
|
||||
"Math" |
|
||||
"Mouse" |
|
||||
"Null" |
|
||||
"Number" |
|
||||
"Object" |
|
||||
"Selection" |
|
||||
"Sound" |
|
||||
"String" |
|
||||
"uint" |
|
||||
"Vector" |
|
||||
"XML" |
|
||||
"XMLNode" |
|
||||
"XMLSocket" { addToken(Token.DATA_TYPE); }
|
||||
|
||||
/* Global functions */
|
||||
"call" |
|
||||
"escape" |
|
||||
"eval" |
|
||||
"fscommand" |
|
||||
"getProperty" |
|
||||
"getTimer" |
|
||||
"getURL" |
|
||||
"getVersion" |
|
||||
"gotoAndPlay" |
|
||||
"gotoAndStop" |
|
||||
"#include" |
|
||||
"int" |
|
||||
"isFinite" |
|
||||
"isNaN" |
|
||||
"loadMovie" |
|
||||
"loadMovieNum" |
|
||||
"loadVariables" |
|
||||
"loadVariablesNum" |
|
||||
"maxscroll" |
|
||||
"newline" |
|
||||
"nextFrame" |
|
||||
"nextScene" |
|
||||
"Number" |
|
||||
"parseFloat" |
|
||||
"parseInt" |
|
||||
"play" |
|
||||
"prevFrame" |
|
||||
"prevScene" |
|
||||
"print" |
|
||||
"printAsBitmap" |
|
||||
"printAsBitmapNum" |
|
||||
"printNum" |
|
||||
"random" |
|
||||
"removeMovieClip" |
|
||||
"scroll" |
|
||||
"setProperty" |
|
||||
"startDrag" |
|
||||
"stop" |
|
||||
"stopAllSounds" |
|
||||
"stopDrag" |
|
||||
"String" |
|
||||
"targetPath" |
|
||||
"tellTarget" |
|
||||
"toggleHighQuality" |
|
||||
"trace" |
|
||||
"unescape" |
|
||||
"unloadMovie" |
|
||||
"unloadMovieNum" |
|
||||
"updateAfterEvent" { addToken(Token.FUNCTION); }
|
||||
|
||||
/* Booleans. */
|
||||
{BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
{WhiteSpace}+ { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* String/Character literals. */
|
||||
{CharLiteral} { addToken(Token.LITERAL_CHAR); }
|
||||
{UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
|
||||
{ErrorCharLiteral} { addToken(Token.ERROR_CHAR); }
|
||||
{StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
{UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
{ErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
|
||||
|
||||
/* Comment literals. */
|
||||
"/**/" { addToken(Token.COMMENT_MULTILINE); }
|
||||
{MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
|
||||
{LineCommentBegin} { start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
|
||||
|
||||
/* Separators. */
|
||||
{Separator} { addToken(Token.SEPARATOR); }
|
||||
{Separator2} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
/* Operators. */
|
||||
{Operator} { addToken(Token.OPERATOR); }
|
||||
|
||||
/* Numbers */
|
||||
{IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
|
||||
{FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
{ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
|
||||
|
||||
{ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters and flag them as bad. */
|
||||
. { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<MLC> {
|
||||
|
||||
[^hwf\n\*]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
{MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
|
||||
\* {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<EOL_COMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -1,273 +0,0 @@
|
||||
/*
|
||||
* 11/18/2009
|
||||
*
|
||||
* BBCodeTokenMaker.java - Generates tokens for BBCode syntax highlighting.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for BBCode.
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>BBCodeTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.7
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class BBCodeTokenMaker
|
||||
%extends AbstractMarkupTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
/**
|
||||
* Token type specific to BBCodeTokenMaker; this signals that the user has
|
||||
* ended a line with an unclosed tag; thus a new line is beginning
|
||||
* still inside of the tag.
|
||||
*/
|
||||
public static final int INTERNAL_INTAG = -1;
|
||||
|
||||
/**
|
||||
* Whether closing markup tags are automatically completed for BBCode.
|
||||
*/
|
||||
private static boolean completeCloseTags = true;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public BBCodeTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets whether markup close tags should be completed. The default value
|
||||
* for BBCode is <code>true</code>.
|
||||
*
|
||||
* @return Whether closing markup tags are completed.
|
||||
* @see #setCompleteCloseTags(boolean)
|
||||
*/
|
||||
@Override
|
||||
public boolean getCompleteCloseTags() {
|
||||
return completeCloseTags;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns <code>null</code> since BBCode has no comments.
|
||||
*
|
||||
* @return <code>null</code> always.
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case INTERNAL_INTAG:
|
||||
state = INTAG;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets whether markup close tags should be completed.
|
||||
*
|
||||
* @param complete Whether closing markup tags are completed.
|
||||
* @see #getCompleteCloseTags()
|
||||
*/
|
||||
public static void setCompleteCloseTags(boolean complete) {
|
||||
completeCloseTags = complete;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Whitespace = ([ \t\f]+)
|
||||
LineTerminator = ([\n])
|
||||
Identifier = ([^ \t\f\n\[]+)
|
||||
InTagIdentifier = ([^ \t\f\n\[\]\/\=]+)
|
||||
Tag = ("b"|"i"|"u"|"s"|"size"|"color"|"center"|"quote"|"url"|"img"|"ul"|"li"|"ol"|"youtube"|"gvideo")
|
||||
|
||||
%state INTAG
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
{Whitespace} { addToken(Token.WHITESPACE); }
|
||||
"[" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
|
||||
"[/" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
}
|
||||
|
||||
<INTAG> {
|
||||
"/" { addToken(Token.MARKUP_TAG_DELIMITER); }
|
||||
{Tag} { addToken(Token.MARKUP_TAG_NAME); }
|
||||
{InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
|
||||
{Whitespace} { addToken(Token.WHITESPACE); }
|
||||
"=" { addToken(Token.OPERATOR); }
|
||||
"/]" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
|
||||
"]" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
|
||||
. { addToken(Token.IDENTIFIER); /* Unhandled chars, not likely */ }
|
||||
<<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
|
||||
}
|
||||
@@ -1,660 +0,0 @@
|
||||
/* The following code was generated by JFlex 1.4.1 on 11/18/09 4:41 PM */
|
||||
/*
|
||||
* 11/18/2009
|
||||
* BBCodeTokenMaker.java - Generates tokens for BBCode syntax highlighting.
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.Token;
|
||||
import org.fife.ui.rsyntaxtextarea.TokenImpl;
|
||||
|
||||
/**
|
||||
* Scanner for BBCode.
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost completely
|
||||
* removed to be competitive with the handwritten lexers (subclasses of
|
||||
* <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around). We can
|
||||
* achieve this because RText always scans exactly 1 line of tokens at a time,
|
||||
* and hands the scanner this line as an array of characters (a Segment really).
|
||||
* Since tokens contain pointers to char arrays instead of Strings holding their
|
||||
* contents, there is no need for allocating new memory for Strings.
|
||||
* <p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.
|
||||
* <p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>BBCodeTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>. You
|
||||
* should hand-delete the second of each definition (the ones generated by the
|
||||
* lexer), as these generated methods modify the input buffer, which we'll never
|
||||
* have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT be
|
||||
* initialized. This is a needless memory allocation for us since we will be
|
||||
* pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would with
|
||||
* any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.7
|
||||
*
|
||||
*/
|
||||
public class BBCodeTokenMaker extends AbstractMarkupTokenMaker {
|
||||
|
||||
/** This character denotes the end of file */
|
||||
public static final int YYEOF = -1;
|
||||
/** lexical states */
|
||||
public static final int INTAG = 1;
|
||||
public static final int YYINITIAL = 0;
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final String ZZ_CMAP_PACKED = "\11\0\1\1\1\2\1\0\1\1\23\0\1\1\16\0\1\27\15\0"
|
||||
+ "\1\30\35\0\1\3\1\0\1\4\4\0\1\5\1\13\1\26\1\12" + "\1\0\1\23\1\0\1\6\2\0\1\15\1\22\1\17\1\14\1\0"
|
||||
+ "\1\21\1\16\1\10\1\20\1\7\1\25\2\0\1\24\1\11\uff85\0";
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
|
||||
/**
|
||||
* Translates DFA states to action switch labels.
|
||||
*/
|
||||
private static final int[] ZZ_ACTION = zzUnpackAction();
|
||||
private static final String ZZ_ACTION_PACKED_0 = "\2\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7"
|
||||
+ "\4\10\6\5\1\11\1\12\1\4\23\5";
|
||||
|
||||
private static int[] zzUnpackAction() {
|
||||
int[] result = new int[41];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAction(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a state to a row index in the transition table
|
||||
*/
|
||||
private static final int[] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\31\0\62\0\113\0\144\0\175\0\226\0\144"
|
||||
+ "\0\144\0\226\0\257\0\310\0\341\0\372\0\u0113\0\u012c"
|
||||
+ "\0\u0145\0\u015e\0\u0177\0\u0190\0\144\0\144\0\u01a9\0\u01c2"
|
||||
+ "\0\u01db\0\u01f4\0\u020d\0\u0226\0\u023f\0\u0258\0\u0271\0\u028a"
|
||||
+ "\0\u02a3\0\u02bc\0\u02d5\0\u02ee\0\u0307\0\u0320\0\u0339\0\u0352" + "\0\u036b";
|
||||
|
||||
private static int[] zzUnpackRowMap() {
|
||||
int[] result = new int[41];
|
||||
int offset = 0;
|
||||
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackRowMap(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int high = packed.charAt(i++) << 16;
|
||||
result[j++] = high | packed.charAt(i++);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* The transition table of the DFA
|
||||
*/
|
||||
private static final int[] ZZ_TRANS = zzUnpackTrans();
|
||||
private static final String ZZ_TRANS_PACKED_0 = "\1\3\1\4\1\5\1\6\25\3\1\7\1\4\1\0"
|
||||
+ "\1\10\1\11\1\12\1\13\1\14\1\15\2\7\1\16" + "\1\17\1\20\3\7\1\21\1\7\1\22\1\23\2\7"
|
||||
+ "\1\24\1\25\1\3\3\0\25\3\1\0\1\4\107\0" + "\1\26\1\0\1\7\4\0\22\7\2\0\1\7\4\0"
|
||||
+ "\15\7\1\27\4\7\2\0\1\7\4\0\10\7\1\12" + "\1\17\10\7\2\0\1\7\4\0\1\7\1\30\20\7"
|
||||
+ "\2\0\1\7\4\0\5\7\1\31\1\7\1\32\12\7" + "\2\0\1\7\4\0\10\7\1\12\11\7\2\0\1\7"
|
||||
+ "\4\0\1\7\1\12\20\7\2\0\1\7\4\0\2\7" + "\1\33\17\7\2\0\1\7\4\0\20\7\1\34\1\7"
|
||||
+ "\2\0\1\7\4\0\7\7\1\35\12\7\6\0\1\11" + "\24\0\1\7\4\0\16\7\1\12\3\7\2\0\1\7"
|
||||
+ "\4\0\4\7\1\36\15\7\2\0\1\7\4\0\12\7" + "\1\37\7\7\2\0\1\7\4\0\10\7\1\40\11\7"
|
||||
+ "\2\0\1\7\4\0\7\7\1\41\12\7\2\0\1\7" + "\4\0\1\7\1\42\20\7\2\0\1\7\4\0\2\7"
|
||||
+ "\1\43\17\7\2\0\1\7\4\0\5\7\1\12\14\7" + "\2\0\1\7\4\0\13\7\1\44\6\7\2\0\1\7"
|
||||
+ "\4\0\7\7\1\45\12\7\2\0\1\7\4\0\13\7" + "\1\36\6\7\2\0\1\7\4\0\21\7\1\46\2\0"
|
||||
+ "\1\7\4\0\13\7\1\47\6\7\2\0\1\7\4\0" + "\5\7\1\45\14\7\2\0\1\7\4\0\11\7\1\12"
|
||||
+ "\10\7\2\0\1\7\4\0\5\7\1\50\14\7\2\0" + "\1\7\4\0\2\7\1\51\17\7\2\0\1\7\4\0"
|
||||
+ "\7\7\1\12\12\7\2\0\1\7\4\0\1\36\21\7" + "\2\0";
|
||||
|
||||
private static int[] zzUnpackTrans() {
|
||||
int[] result = new int[900];
|
||||
int offset = 0;
|
||||
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackTrans(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
value--;
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/* error codes */
|
||||
private static final int ZZ_UNKNOWN_ERROR = 0;
|
||||
private static final int ZZ_NO_MATCH = 1;
|
||||
private static final int ZZ_PUSHBACK_2BIG = 2;
|
||||
/* error messages for the codes above */
|
||||
private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input",
|
||||
"Error: pushback value was too large" };
|
||||
/**
|
||||
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
|
||||
*/
|
||||
private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 = "\2\0\2\1\1\11\2\1\2\11\13\1\2\11\23\1";
|
||||
|
||||
private static int[] zzUnpackAttribute() {
|
||||
int[] result = new int[41];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAttribute(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/** the input device */
|
||||
private java.io.Reader zzReader;
|
||||
/** the current state of the DFA */
|
||||
private int zzState;
|
||||
/** the current lexical state */
|
||||
private int zzLexicalState = YYINITIAL;
|
||||
/**
|
||||
* this buffer contains the current text to be matched and is the source of the
|
||||
* yytext() string
|
||||
*/
|
||||
private char zzBuffer[];
|
||||
/** the textposition at the last accepting state */
|
||||
private int zzMarkedPos;
|
||||
/** the current text position in the buffer */
|
||||
private int zzCurrentPos;
|
||||
/** startRead marks the beginning of the yytext() string in the buffer */
|
||||
private int zzStartRead;
|
||||
/**
|
||||
* endRead marks the last character in the buffer, that has been read from input
|
||||
*/
|
||||
private int zzEndRead;
|
||||
/** zzAtEOF == true <=> the scanner is at the EOF */
|
||||
private boolean zzAtEOF;
|
||||
/* user code: */
|
||||
/**
|
||||
* Token type specific to BBCodeTokenMaker; this signals that the user has ended
|
||||
* a line with an unclosed tag; thus a new line is beginning still inside of the
|
||||
* tag.
|
||||
*/
|
||||
public static final int INTERNAL_INTAG = -1;
|
||||
/**
|
||||
* Whether closing markup tags are automatically completed for BBCode.
|
||||
*/
|
||||
private static boolean completeCloseTags = true;
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a no-parameter
|
||||
* constructor.
|
||||
*/
|
||||
public BBCodeTokenMaker() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos - 1, tokenType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start, end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether markup close tags should be completed. The default value for
|
||||
* BBCode is <code>true</code>.
|
||||
*
|
||||
* @return Whether closing markup tags are completed.
|
||||
* @see #setCompleteCloseTags(boolean)
|
||||
*/
|
||||
@Override
|
||||
public boolean getCompleteCloseTags() {
|
||||
return completeCloseTags;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>null</code> since BBCode has no comments.
|
||||
*
|
||||
* @return <code>null</code> always.
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated from
|
||||
* <code>text</code>. This method must be implemented by subclasses so they can
|
||||
* correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing the syntax
|
||||
* highlighted text.
|
||||
*/
|
||||
@Override
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case INTERNAL_INTAG:
|
||||
state = INTAG;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether markup close tags should be completed.
|
||||
*
|
||||
* @param complete Whether closing markup tags are completed.
|
||||
* @see #getCompleteCloseTags()
|
||||
*/
|
||||
public static void setCompleteCloseTags(boolean complete) {
|
||||
completeCloseTags = complete;
|
||||
}
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos >= s.offset + s.count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream. Does not close the old
|
||||
* reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream <b>cannot</b> be
|
||||
* reused (internal buffer is discarded and lost). Lexical state is set to
|
||||
* <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill no longer
|
||||
* "refills" the buffer (since the way we do it, it's always "full" the first
|
||||
* time through, since it points to the segment's array). So, we assign
|
||||
* zzEndRead here.
|
||||
*/
|
||||
// zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner There is also a java.io.InputStream version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
public BBCodeTokenMaker(java.io.Reader in) {
|
||||
this.zzReader = in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner. There is also java.io.Reader version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Inputstream to read input from.
|
||||
*/
|
||||
public BBCodeTokenMaker(java.io.InputStream in) {
|
||||
this(new java.io.InputStreamReader(in));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unpacks the compressed character translation table.
|
||||
*
|
||||
* @param packed the packed character translation table
|
||||
* @return the unpacked character translation table
|
||||
*/
|
||||
private static char[] zzUnpackCMap(String packed) {
|
||||
char[] map = new char[0x10000];
|
||||
int i = 0; /* index in packed string */
|
||||
int j = 0; /* index in unpacked array */
|
||||
while (i < 80) {
|
||||
int count = packed.charAt(i++);
|
||||
char value = packed.charAt(i++);
|
||||
do
|
||||
map[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the input stream.
|
||||
*/
|
||||
public final void yyclose() throws java.io.IOException {
|
||||
zzAtEOF = true; /* indicate end of file */
|
||||
zzEndRead = zzStartRead; /* invalidate buffer */
|
||||
if (zzReader != null)
|
||||
zzReader.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current lexical state.
|
||||
*/
|
||||
public final int yystate() {
|
||||
return zzLexicalState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enters a new lexical state
|
||||
*
|
||||
* @param newState the new lexical state
|
||||
*/
|
||||
@Override
|
||||
public final void yybegin(int newState) {
|
||||
zzLexicalState = newState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the text matched by the current regular expression.
|
||||
*/
|
||||
public final String yytext() {
|
||||
return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character at position <tt>pos</tt> from the matched text.
|
||||
*
|
||||
* It is equivalent to yytext().charAt(pos), but faster
|
||||
*
|
||||
* @param pos the position of the character to fetch. A value from 0 to
|
||||
* yylength()-1.
|
||||
*
|
||||
* @return the character at position pos
|
||||
*/
|
||||
public final char yycharat(int pos) {
|
||||
return zzBuffer[zzStartRead + pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the length of the matched text region.
|
||||
*/
|
||||
public final int yylength() {
|
||||
return zzMarkedPos - zzStartRead;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports an error that occured while scanning.
|
||||
*
|
||||
* In a wellformed scanner (no or only correct usage of yypushback(int) and a
|
||||
* match-all fallback rule) this method will only be called with things that
|
||||
* "Can't Possibly Happen". If this method is called, something is seriously
|
||||
* wrong (e.g. a JFlex bug producing a faulty scanner etc.).
|
||||
*
|
||||
* Usual syntax/scanner level error handling should be done in error fallback
|
||||
* rules.
|
||||
*
|
||||
* @param errorCode the code of the errormessage to display
|
||||
*/
|
||||
private void zzScanError(int errorCode) {
|
||||
String message;
|
||||
try {
|
||||
message = ZZ_ERROR_MSG[errorCode];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
|
||||
}
|
||||
throw new Error(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes the specified amount of characters back into the input stream.
|
||||
*
|
||||
* They will be read again by then next call of the scanning method
|
||||
*
|
||||
* @param number the number of characters to be read again. This number must not
|
||||
* be greater than yylength()!
|
||||
*/
|
||||
public void yypushback(int number) {
|
||||
if (number > yylength())
|
||||
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||
zzMarkedPos -= number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resumes scanning until the next regular expression is matched, the end of
|
||||
* input is encountered or an I/O-Error occurs.
|
||||
*
|
||||
* @return the next token
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
|
||||
int zzInput;
|
||||
int zzAction;
|
||||
// cached fields:
|
||||
int zzCurrentPosL;
|
||||
int zzMarkedPosL;
|
||||
int zzEndReadL = zzEndRead;
|
||||
char[] zzBufferL = zzBuffer;
|
||||
char[] zzCMapL = ZZ_CMAP;
|
||||
int[] zzTransL = ZZ_TRANS;
|
||||
int[] zzRowMapL = ZZ_ROWMAP;
|
||||
int[] zzAttrL = ZZ_ATTRIBUTE;
|
||||
while (true) {
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzAction = -1;
|
||||
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
|
||||
zzState = zzLexicalState;
|
||||
zzForAction: {
|
||||
while (true) {
|
||||
if (zzCurrentPosL < zzEndReadL)
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
else if (zzAtEOF) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
// store back cached positions
|
||||
zzCurrentPos = zzCurrentPosL;
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
boolean eof = zzRefill();
|
||||
// get translated positions and possibly new buffer
|
||||
zzCurrentPosL = zzCurrentPos;
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzBufferL = zzBuffer;
|
||||
zzEndReadL = zzEndRead;
|
||||
if (eof) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
}
|
||||
}
|
||||
int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
|
||||
if (zzNext == -1)
|
||||
break zzForAction;
|
||||
zzState = zzNext;
|
||||
int zzAttributes = zzAttrL[zzState];
|
||||
if ((zzAttributes & 1) == 1) {
|
||||
zzAction = zzState;
|
||||
zzMarkedPosL = zzCurrentPosL;
|
||||
if ((zzAttributes & 8) == 8)
|
||||
break zzForAction;
|
||||
}
|
||||
}
|
||||
}
|
||||
// store back cached position
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||
case 1: {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
case 11:
|
||||
break;
|
||||
case 9: {
|
||||
addToken(Token.MARKUP_TAG_DELIMITER);
|
||||
}
|
||||
case 12:
|
||||
break;
|
||||
case 2: {
|
||||
addToken(Token.WHITESPACE);
|
||||
}
|
||||
case 13:
|
||||
break;
|
||||
case 10: {
|
||||
addToken(Token.OPERATOR);
|
||||
}
|
||||
case 14:
|
||||
break;
|
||||
case 8: {
|
||||
addToken(Token.MARKUP_TAG_NAME);
|
||||
}
|
||||
case 15:
|
||||
break;
|
||||
case 4: {
|
||||
addToken(Token.MARKUP_TAG_DELIMITER);
|
||||
yybegin(INTAG);
|
||||
}
|
||||
case 16:
|
||||
break;
|
||||
case 6: {
|
||||
addToken(Token.IDENTIFIER); /* Unhandled chars, not likely */
|
||||
}
|
||||
case 17:
|
||||
break;
|
||||
case 5: {
|
||||
addToken(Token.MARKUP_TAG_ATTRIBUTE);
|
||||
}
|
||||
case 18:
|
||||
break;
|
||||
case 3: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 19:
|
||||
break;
|
||||
case 7: {
|
||||
yybegin(YYINITIAL);
|
||||
addToken(Token.MARKUP_TAG_DELIMITER);
|
||||
}
|
||||
case 20:
|
||||
break;
|
||||
default:
|
||||
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
|
||||
zzAtEOF = true;
|
||||
switch (zzLexicalState) {
|
||||
case INTAG: {
|
||||
addToken(zzMarkedPos, zzMarkedPos, INTERNAL_INTAG);
|
||||
return firstToken;
|
||||
}
|
||||
case 42:
|
||||
break;
|
||||
case YYINITIAL: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 43:
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,685 +0,0 @@
|
||||
/*
|
||||
* 11/19/2004
|
||||
*
|
||||
* CPlusPlusTokenMaker.java - An object that can take a chunk of text and
|
||||
* return a linked list of tokens representing it in C++.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* A parser for the C++ programming language.
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>CPlusPlusTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.6
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class CPlusPlusTokenMaker
|
||||
%extends AbstractJFlexCTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public CPlusPlusTokenMaker() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "//", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
@Override
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = YYINITIAL;
|
||||
switch (initialTokenType) {
|
||||
case Token.COMMENT_EOL:
|
||||
state = EOL_COMMENT;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.COMMENT_MULTILINE:
|
||||
state = MLC;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = YYINITIAL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Letter = [A-Za-z]
|
||||
LetterOrUnderscore = ({Letter}|"_")
|
||||
Digit = [0-9]
|
||||
HexDigit = {Digit}|[A-Fa-f]
|
||||
OctalDigit = [0-7]
|
||||
Exponent = [eE][+-]?{Digit}+
|
||||
|
||||
PreprocessorWord = define|elif|else|endif|error|if|ifdef|ifndef|include|line|pragma|undef
|
||||
|
||||
Trigraph = ("??="|"??("|"??)"|"??/"|"??'"|"??<"|"??>"|"??!"|"??-")
|
||||
|
||||
OctEscape1 = ([\\]{OctalDigit})
|
||||
OctEscape2 = ([\\]{OctalDigit}{OctalDigit})
|
||||
OctEscape3 = ([\\][0-3]{OctalDigit}{OctalDigit})
|
||||
OctEscape = ({OctEscape1}|{OctEscape2}|{OctEscape3})
|
||||
HexEscape = ([\\][xX]{HexDigit}{HexDigit})
|
||||
|
||||
AnyChrChr = ([^\'\n\\])
|
||||
Escape = ([\\]([abfnrtv\'\"\?\\0e]))
|
||||
UnclosedCharLiteral = ([\']({Escape}|{OctEscape}|{HexEscape}|{Trigraph}|{AnyChrChr}))
|
||||
CharLiteral = ({UnclosedCharLiteral}[\'])
|
||||
ErrorUnclosedCharLiteral = ([\'][^\'\n]*)
|
||||
ErrorCharLiteral = (([\'][\'])|{ErrorUnclosedCharLiteral}[\'])
|
||||
AnyStrChr = ([^\"\n\\])
|
||||
FalseTrigraph = (("?"(("?")*)[^\=\(\)\/\'\<\>\!\-\\\?\"\n])|("?"[\=\(\)\/\'\<\>\!\-]))
|
||||
StringLiteral = ([\"]((((("?")*)({Escape}|{OctEscape}|{HexEscape}|{Trigraph}))|{FalseTrigraph}|{AnyStrChr})*)(("?")*)[\"])
|
||||
UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
|
||||
ErrorStringLiteral = ({UnclosedStringLiteral}[\"])
|
||||
|
||||
|
||||
LineTerminator = \n
|
||||
WhiteSpace = [ \t\f]
|
||||
|
||||
MLCBegin = "/*"
|
||||
MLCEnd = "*/"
|
||||
LineCommentBegin = "//"
|
||||
|
||||
NonFloatSuffix = (([uU][lL]?)|([lL][uU]?))
|
||||
IntegerLiteral = ({Digit}+{Exponent}?{NonFloatSuffix}?)
|
||||
HexLiteral = ("0"[xX]{HexDigit}+{NonFloatSuffix}?)
|
||||
FloatLiteral = ((({Digit}*[\.]{Digit}+)|({Digit}+[\.]{Digit}*)){Exponent}?[fFlL]?)
|
||||
ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
|
||||
|
||||
NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#")
|
||||
Identifier = ({LetterOrUnderscore}({LetterOrUnderscore}|{Digit}|[$])*)
|
||||
ErrorIdentifier = ({NonSeparator}+)
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$]|{Letter}|{Digit})
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
|
||||
%state MLC
|
||||
%state EOL_COMMENT
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
/* Keywords */
|
||||
"auto" |
|
||||
"break" |
|
||||
"case" |
|
||||
"catch" |
|
||||
"class" |
|
||||
"const" |
|
||||
"const_cast" |
|
||||
"continue" |
|
||||
"default" |
|
||||
"delete" |
|
||||
"do" |
|
||||
"dynamic_cast" |
|
||||
"else" |
|
||||
"enum" |
|
||||
"explicit" |
|
||||
"extern" |
|
||||
"for" |
|
||||
"friend" |
|
||||
"goto" |
|
||||
"if" |
|
||||
"inline" |
|
||||
"mutable" |
|
||||
"namespace" |
|
||||
"new" |
|
||||
"operator" |
|
||||
"private" |
|
||||
"protected" |
|
||||
"public" |
|
||||
"register" |
|
||||
"reinterpret_cast" |
|
||||
"sizeof" |
|
||||
"static" |
|
||||
"static_cast" |
|
||||
"struct" |
|
||||
"switch" |
|
||||
"template" |
|
||||
"this" |
|
||||
"throw" |
|
||||
"try" |
|
||||
"typedef" |
|
||||
"typeid" |
|
||||
"typename" |
|
||||
"union" |
|
||||
"using" |
|
||||
"virtual" |
|
||||
"volatile" |
|
||||
"while" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
"return" { addToken(Token.RESERVED_WORD_2); }
|
||||
|
||||
/* Boolean literals. */
|
||||
"true" |
|
||||
"false" |
|
||||
|
||||
/* Data types. */
|
||||
"char" |
|
||||
"div_t" |
|
||||
"double" |
|
||||
"float" |
|
||||
"int" |
|
||||
"ldiv_t" |
|
||||
"long" |
|
||||
"short" |
|
||||
"signed" |
|
||||
"size_t" |
|
||||
"unsigned" |
|
||||
"void" |
|
||||
"wchar_t" { addToken(Token.DATA_TYPE); }
|
||||
|
||||
/* Standard functions */
|
||||
"abort" |
|
||||
"abs" |
|
||||
"acos" |
|
||||
"asctime" |
|
||||
"asin" |
|
||||
"assert" |
|
||||
"atan2" |
|
||||
"atan" |
|
||||
"atexit" |
|
||||
"atof" |
|
||||
"atoi" |
|
||||
"atol" |
|
||||
"bsearch" |
|
||||
"btowc" |
|
||||
"calloc" |
|
||||
"ceil" |
|
||||
"clearerr" |
|
||||
"clock" |
|
||||
"cosh" |
|
||||
"cos" |
|
||||
"ctime" |
|
||||
"difftime" |
|
||||
"div" |
|
||||
"errno" |
|
||||
"exit" |
|
||||
"exp" |
|
||||
"fabs" |
|
||||
"fclose" |
|
||||
"feof" |
|
||||
"ferror" |
|
||||
"fflush" |
|
||||
"fgetc" |
|
||||
"fgetpos" |
|
||||
"fgetwc" |
|
||||
"fgets" |
|
||||
"fgetws" |
|
||||
"floor" |
|
||||
"fmod" |
|
||||
"fopen" |
|
||||
"fprintf" |
|
||||
"fputc" |
|
||||
"fputs" |
|
||||
"fputwc" |
|
||||
"fputws" |
|
||||
"fread" |
|
||||
"free" |
|
||||
"freopen" |
|
||||
"frexp" |
|
||||
"fscanf" |
|
||||
"fseek" |
|
||||
"fsetpos" |
|
||||
"ftell" |
|
||||
"fwprintf" |
|
||||
"fwrite" |
|
||||
"fwscanf" |
|
||||
"getchar" |
|
||||
"getc" |
|
||||
"getenv" |
|
||||
"gets" |
|
||||
"getwc" |
|
||||
"getwchar" |
|
||||
"gmtime" |
|
||||
"isalnum" |
|
||||
"isalpha" |
|
||||
"iscntrl" |
|
||||
"isdigit" |
|
||||
"isgraph" |
|
||||
"islower" |
|
||||
"isprint" |
|
||||
"ispunct" |
|
||||
"isspace" |
|
||||
"isupper" |
|
||||
"isxdigit" |
|
||||
"labs" |
|
||||
"ldexp" |
|
||||
"ldiv" |
|
||||
"localeconv" |
|
||||
"localtime" |
|
||||
"log10" |
|
||||
"log" |
|
||||
"longjmp" |
|
||||
"malloc" |
|
||||
"mblen" |
|
||||
"mbrlen" |
|
||||
"mbrtowc" |
|
||||
"mbsinit" |
|
||||
"mbsrtowcs" |
|
||||
"mbstowcs" |
|
||||
"mbtowc" |
|
||||
"memchr" |
|
||||
"memcmp" |
|
||||
"memcpy" |
|
||||
"memmove" |
|
||||
"memset" |
|
||||
"mktime" |
|
||||
"modf" |
|
||||
"offsetof" |
|
||||
"perror" |
|
||||
"pow" |
|
||||
"printf" |
|
||||
"putchar" |
|
||||
"putc" |
|
||||
"puts" |
|
||||
"putwc" |
|
||||
"putwchar" |
|
||||
"qsort" |
|
||||
"raise" |
|
||||
"rand" |
|
||||
"realloc" |
|
||||
"remove" |
|
||||
"rename" |
|
||||
"rewind" |
|
||||
"scanf" |
|
||||
"setbuf" |
|
||||
"setjmp" |
|
||||
"setlocale" |
|
||||
"setvbuf" |
|
||||
"setvbuf" |
|
||||
"signal" |
|
||||
"sinh" |
|
||||
"sin" |
|
||||
"sprintf" |
|
||||
"sqrt" |
|
||||
"srand" |
|
||||
"sscanf" |
|
||||
"strcat" |
|
||||
"strchr" |
|
||||
"strcmp" |
|
||||
"strcmp" |
|
||||
"strcoll" |
|
||||
"strcpy" |
|
||||
"strcspn" |
|
||||
"strerror" |
|
||||
"strftime" |
|
||||
"strlen" |
|
||||
"strncat" |
|
||||
"strncmp" |
|
||||
"strncpy" |
|
||||
"strpbrk" |
|
||||
"strrchr" |
|
||||
"strspn" |
|
||||
"strstr" |
|
||||
"strtod" |
|
||||
"strtok" |
|
||||
"strtol" |
|
||||
"strtoul" |
|
||||
"strxfrm" |
|
||||
"swprintf" |
|
||||
"swscanf" |
|
||||
"system" |
|
||||
"tanh" |
|
||||
"tan" |
|
||||
"time" |
|
||||
"tmpfile" |
|
||||
"tmpnam" |
|
||||
"tolower" |
|
||||
"toupper" |
|
||||
"ungetc" |
|
||||
"ungetwc" |
|
||||
"va_arg" |
|
||||
"va_end" |
|
||||
"va_start" |
|
||||
"vfprintf" |
|
||||
"vfwprintf" |
|
||||
"vprintf" |
|
||||
"vsprintf" |
|
||||
"vswprintf" |
|
||||
"vwprintf" |
|
||||
"wcrtomb" |
|
||||
"wcscat" |
|
||||
"wcschr" |
|
||||
"wcscmp" |
|
||||
"wcscoll" |
|
||||
"wcscpy" |
|
||||
"wcscspn" |
|
||||
"wcsftime" |
|
||||
"wcslen" |
|
||||
"wcsncat" |
|
||||
"wcsncmp" |
|
||||
"wcsncpy" |
|
||||
"wcspbrk" |
|
||||
"wcsrchr" |
|
||||
"wcsrtombs" |
|
||||
"wcsspn" |
|
||||
"wcsstr" |
|
||||
"wcstod" |
|
||||
"wcstok" |
|
||||
"wcstol" |
|
||||
"wcstombs" |
|
||||
"wcstoul" |
|
||||
"wcsxfrm" |
|
||||
"wctob" |
|
||||
"wctomb" |
|
||||
"wmemchr" |
|
||||
"wmemcmp" |
|
||||
"wmemcpy" |
|
||||
"wmemmove" |
|
||||
"wmemset" |
|
||||
"wprintf" |
|
||||
"wscanf" { addToken(Token.FUNCTION); }
|
||||
|
||||
/* Standard-defined macros. */
|
||||
"__DATE__" |
|
||||
"__TIME__" |
|
||||
"__FILE__" |
|
||||
"__LINE__" |
|
||||
"__STDC__" { addToken(Token.PREPROCESSOR); }
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
{WhiteSpace}+ { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* Preprocessor directives */
|
||||
"#"{WhiteSpace}*{PreprocessorWord} { addToken(Token.PREPROCESSOR); }
|
||||
|
||||
/* String/Character Literals. */
|
||||
{CharLiteral} { addToken(Token.LITERAL_CHAR); }
|
||||
{UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/ }
|
||||
{ErrorUnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
|
||||
{ErrorCharLiteral} { addToken(Token.ERROR_CHAR); }
|
||||
{StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
{UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
{ErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
|
||||
|
||||
/* Comment Literals. */
|
||||
{MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
|
||||
{LineCommentBegin} { start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
|
||||
|
||||
/* Separators. */
|
||||
"(" |
|
||||
")" |
|
||||
"[" |
|
||||
"]" |
|
||||
"{" |
|
||||
"}" { addToken(Token.SEPARATOR); }
|
||||
|
||||
/* Operators. */
|
||||
{Trigraph} |
|
||||
"=" |
|
||||
"+" |
|
||||
"-" |
|
||||
"*" |
|
||||
"/" |
|
||||
"%" |
|
||||
"~" |
|
||||
"<" |
|
||||
">" |
|
||||
"<<" |
|
||||
">>" |
|
||||
"==" |
|
||||
"+=" |
|
||||
"-=" |
|
||||
"*=" |
|
||||
"/=" |
|
||||
"%=" |
|
||||
"&=" |
|
||||
"|=" |
|
||||
"^=" |
|
||||
">=" |
|
||||
"<=" |
|
||||
"!=" |
|
||||
">>=" |
|
||||
"<<=" |
|
||||
"^" |
|
||||
"&" |
|
||||
"&&" |
|
||||
"|" |
|
||||
"||" |
|
||||
"?" |
|
||||
":" |
|
||||
"," |
|
||||
"!" |
|
||||
"++" |
|
||||
"--" |
|
||||
"." |
|
||||
"," { addToken(Token.OPERATOR); }
|
||||
|
||||
/* Numbers */
|
||||
{IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
|
||||
{FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
{ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
|
||||
|
||||
/* Some lines will end in '\' to wrap an expression. */
|
||||
"\\" { addToken(Token.IDENTIFIER); }
|
||||
|
||||
{ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
/* Other punctuation, we'll highlight it as "identifiers." */
|
||||
";" { addToken(Token.IDENTIFIER); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters and flag them as bad. */
|
||||
. { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
<MLC> {
|
||||
|
||||
[^hwf\n\*]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
{MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
|
||||
\* {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
<EOL_COMMENT> {
|
||||
[^hwf\\\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\\. { /* Skip all escaped chars. */ }
|
||||
\\ { /* Line ending in '\' => continue to next line. */
|
||||
addToken(start,zzStartRead, Token.COMMENT_EOL);
|
||||
return firstToken;
|
||||
}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,558 +0,0 @@
|
||||
/*
|
||||
* 09/03/2005
|
||||
*
|
||||
* CSSTokenMaker.java - Token maker for CSS 3 files.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* This class splits up text into tokens representing a CSS 3 file. It's
|
||||
* written with a few extra internal states so that it can easily be copy
|
||||
* and pasted into HTML, PHP, and JSP TokenMakres when it is updated.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>CSSTokenMaker.java</code> file will contain 2
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class CSSTokenMaker
|
||||
%extends AbstractJFlexCTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
/**
|
||||
* Internal type denoting a line ending in a CSS property.
|
||||
*/
|
||||
public static final int INTERNAL_CSS_PROPERTY = -1;
|
||||
|
||||
/**
|
||||
* Internal type denoting a line ending in a CSS property value.
|
||||
*/
|
||||
public static final int INTERNAL_CSS_VALUE = -2;
|
||||
|
||||
/**
|
||||
* Internal type denoting line ending in a CSS double-quote string.
|
||||
* The state to return to is embedded in the actual end token type.
|
||||
*/
|
||||
public static final int INTERNAL_CSS_STRING = -(1<<11);
|
||||
|
||||
/**
|
||||
* Internal type denoting line ending in a CSS single-quote string.
|
||||
* The state to return to is embedded in the actual end token type.
|
||||
*/
|
||||
public static final int INTERNAL_CSS_CHAR = -(2<<11);
|
||||
|
||||
/**
|
||||
* Internal type denoting line ending in a CSS multi-line comment.
|
||||
* The state to return to is embedded in the actual end token type.
|
||||
*/
|
||||
public static final int INTERNAL_CSS_MLC = -(3<<11);
|
||||
|
||||
/**
|
||||
* The state previous CSS-related state we were in before going into a CSS
|
||||
* string, multi-line comment, etc.
|
||||
*/
|
||||
private int cssPrevState;
|
||||
|
||||
/**
|
||||
* Whether we are highlighting less instead of CSS.
|
||||
*/
|
||||
private boolean highlightingLess;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public CSSTokenMaker() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens as an
|
||||
* "end token;" that is, at <code>zzMarkedPos</code>.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addEndToken(int tokenType) {
|
||||
addToken(zzMarkedPos,zzMarkedPos, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the closest {@link TokenTypes "standard" token type} for a given
|
||||
* "internal" token type (e.g. one whose value is <code>< 0</code>).
|
||||
*/
|
||||
@Override
|
||||
public int getClosestStandardTokenTypeForInternalType(int type) {
|
||||
switch (type) {
|
||||
case INTERNAL_CSS_STRING:
|
||||
case INTERNAL_CSS_CHAR:
|
||||
return TokenTypes.LITERAL_STRING_DOUBLE_QUOTE;
|
||||
case INTERNAL_CSS_MLC:
|
||||
return TokenTypes.COMMENT_MULTILINE;
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns <code>true</code> since CSS uses curly braces.
|
||||
*
|
||||
* @return <code>true</code> always.
|
||||
*/
|
||||
public boolean getCurlyBracesDenoteCodeBlocks() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public boolean getMarkOccurrencesOfTokenType(int type) {
|
||||
return type==Token.RESERVED_WORD; // Used for CSS keys
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public boolean getShouldIndentNextLineAfter(Token t) {
|
||||
if (t!=null && t.length()==1) {
|
||||
char ch = t.charAt(0);
|
||||
return ch=='{' || ch=='(';
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
cssPrevState = YYINITIAL; // Shouldn't be necessary
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = YYINITIAL;
|
||||
switch (initialTokenType) {
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = CSS_STRING;
|
||||
break;
|
||||
case Token.LITERAL_CHAR:
|
||||
state = CSS_CHAR_LITERAL;
|
||||
break;
|
||||
case Token.COMMENT_MULTILINE:
|
||||
state = CSS_C_STYLE_COMMENT;
|
||||
break;
|
||||
case INTERNAL_CSS_PROPERTY:
|
||||
state = CSS_PROPERTY;
|
||||
break;
|
||||
case INTERNAL_CSS_VALUE:
|
||||
state = CSS_VALUE;
|
||||
break;
|
||||
default:
|
||||
if (initialTokenType<-1024) {
|
||||
int main = -(-initialTokenType & 0xffffff00);
|
||||
switch (main) {
|
||||
default: // Should never happen
|
||||
case INTERNAL_CSS_STRING:
|
||||
state = CSS_STRING;
|
||||
break;
|
||||
case INTERNAL_CSS_CHAR:
|
||||
state = CSS_CHAR_LITERAL;
|
||||
break;
|
||||
case INTERNAL_CSS_MLC:
|
||||
state = CSS_C_STYLE_COMMENT;
|
||||
break;
|
||||
}
|
||||
cssPrevState = -initialTokenType&0xff;
|
||||
}
|
||||
else {
|
||||
state = YYINITIAL;
|
||||
}
|
||||
}
|
||||
|
||||
start = text.offset;
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Overridden to accept letters, digits, underscores, and hyphens.
|
||||
*/
|
||||
@Override
|
||||
public boolean isIdentifierChar(int languageIndex, char ch) {
|
||||
return Character.isLetterOrDigit(ch) || ch=='-' || ch=='.' || ch=='_';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Toggles whether we're highlighting less instead of just CSS.
|
||||
*
|
||||
* @param highlightingLess Whether we're highlighting less.
|
||||
*/
|
||||
public void setHighlightingLess(boolean highlightingLess) {
|
||||
this.highlightingLess = highlightingLess;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Digit = ([0-9])
|
||||
Letter = ([A-Za-z])
|
||||
LetterOrUnderscore = ({Letter}|[_])
|
||||
LetterOrUnderscoreOrDash = ({LetterOrUnderscore}|[\-])
|
||||
|
||||
CSS_SelectorPiece = (("*"|"."|{LetterOrUnderscoreOrDash})({LetterOrUnderscoreOrDash}|"."|{Digit})*)
|
||||
CSS_PseudoClass = (":"("root"|"nth-child"|"nth-last-child"|"nth-of-type"|"nth-last-of-type"|"first-child"|"last-child"|"first-of-type"|"last-of-type"|"only-child"|"only-of-type"|"empty"|"link"|"visited"|"active"|"hover"|"focus"|"target"|"lang"|"enabled"|"disabled"|"checked"|":first-line"|":first-letter"|":before"|":after"|"not"))
|
||||
CSS_AtRule = ("@"(charset|import|namespace|media|document|page|font-face|keyframes|viewport))
|
||||
CSS_Less_Var = ("@"({LetterOrUnderscoreOrDash})({LetterOrUnderscoreOrDash}|"."|{Digit})*)
|
||||
CSS_Id = ("#"{CSS_SelectorPiece})
|
||||
CSS_Separator = ([;\(\)\[\]])
|
||||
WhiteSpace = ([ \t]+)
|
||||
MlcStart = ("/*")
|
||||
MlcEnd = ("*/")
|
||||
|
||||
CSS_Property = ([\*]?{LetterOrUnderscoreOrDash}({LetterOrUnderscoreOrDash}|{Digit})*(:[\w]+)?)
|
||||
CSS_ValueChar = ({LetterOrUnderscoreOrDash}|[\\/])
|
||||
CSS_Value = ({CSS_ValueChar}*)
|
||||
CSS_Function = ({CSS_Value}\()
|
||||
CSS_Digits = ([\-]?{Digit}+([0-9\.]+)?(pt|pc|in|mm|cm|em|ex|px|ms|s|%)?)
|
||||
CSS_Hex = ("#"[0-9a-fA-F]+)
|
||||
CSS_Number = ({CSS_Digits}|{CSS_Hex})
|
||||
|
||||
// Less_Nested_Selector includes pseudo-classes for ease of highlighting, even
|
||||
// though it is not as detailed as standard CSS selector highlighting.
|
||||
Less_Nested_Selector_With_Pseudo = ({CSS_SelectorPiece}{CSS_PseudoClass}*)
|
||||
Less_Selector_ParentRef = ("&"{CSS_SelectorPiece})
|
||||
Less_LineCommentBegin = "//"
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$]|{Letter}|{Digit})
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
|
||||
%state CSS_PROPERTY
|
||||
%state CSS_VALUE
|
||||
%state CSS_STRING
|
||||
%state CSS_CHAR_LITERAL
|
||||
%state CSS_C_STYLE_COMMENT
|
||||
%state LESS_EOL_COMMENT
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
{CSS_SelectorPiece} { addToken(Token.DATA_TYPE); }
|
||||
{CSS_PseudoClass} { addToken(Token.RESERVED_WORD); }
|
||||
":" { /* Unknown pseudo class */ addToken(Token.DATA_TYPE); }
|
||||
{CSS_AtRule} { addToken(Token.REGEX); }
|
||||
{CSS_Less_Var} { addToken(highlightingLess ? Token.VARIABLE : Token.REGEX); }
|
||||
{CSS_Number} { addToken(highlightingLess ? Token.LITERAL_NUMBER_DECIMAL_INT : Token.IDENTIFIER); }
|
||||
{CSS_Id} { addToken(highlightingLess ? Token.ANNOTATION : Token.VARIABLE); }
|
||||
"{" { addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY); }
|
||||
[,] { addToken(Token.IDENTIFIER); }
|
||||
\" { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
|
||||
\' { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
|
||||
"}" { addToken(highlightingLess ? Token.SEPARATOR : Token.IDENTIFIER); }
|
||||
[+>~\^$\|=] { addToken(Token.OPERATOR); }
|
||||
{CSS_Separator} { addToken(Token.SEPARATOR); }
|
||||
{WhiteSpace} { addToken(Token.WHITESPACE); }
|
||||
{MlcStart} { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
|
||||
{Less_LineCommentBegin} {
|
||||
if (highlightingLess) {
|
||||
start = zzMarkedPos-2; yybegin(LESS_EOL_COMMENT);
|
||||
}
|
||||
else { // Highlight the "//" as an identifier and continue on
|
||||
int temp = zzStartRead + 2;
|
||||
addToken(zzStartRead, zzStartRead + 1, Token.IDENTIFIER);
|
||||
zzStartRead = temp;
|
||||
}
|
||||
}
|
||||
. { /*System.out.println("yyinitial: " + yytext());*/ addToken(Token.IDENTIFIER); }
|
||||
"\n" |
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
}
|
||||
|
||||
<CSS_PROPERTY> {
|
||||
{CSS_Property} { addToken(Token.RESERVED_WORD); }
|
||||
{CSS_Less_Var} { addToken(highlightingLess ? Token.VARIABLE : Token.IDENTIFIER); }
|
||||
{Less_Nested_Selector_With_Pseudo} { addToken(highlightingLess ? Token.RESERVED_WORD : Token.IDENTIFIER); }
|
||||
{Less_Selector_ParentRef} {
|
||||
if (highlightingLess) {
|
||||
// Unfortunately, as we're sharing the CSS and Less
|
||||
// syntax highlighting, we do not color nested selectors
|
||||
// properly. For uniformity, color this the same as
|
||||
// CSS_Property
|
||||
addToken(Token.RESERVED_WORD);
|
||||
}
|
||||
else {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
}
|
||||
"{" { addToken(Token.SEPARATOR); /* helps with auto-closing curlies when editing CSS */ }
|
||||
"}" { addToken(Token.SEPARATOR); yybegin(YYINITIAL); }
|
||||
":" { addToken(Token.OPERATOR); yybegin(CSS_VALUE); }
|
||||
{WhiteSpace} { addToken(Token.WHITESPACE); }
|
||||
{MlcStart} { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
|
||||
{Less_LineCommentBegin} {
|
||||
if (highlightingLess) {
|
||||
cssPrevState = zzLexicalState;
|
||||
start = zzMarkedPos-2; yybegin(LESS_EOL_COMMENT);
|
||||
}
|
||||
else { // Highlight the "//" as an identifier and continue on
|
||||
int temp = zzStartRead + 2;
|
||||
addToken(zzStartRead, zzStartRead + 1, Token.IDENTIFIER);
|
||||
zzStartRead = temp;
|
||||
}
|
||||
}
|
||||
. { /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER); }
|
||||
"\n" |
|
||||
<<EOF>> { addEndToken(INTERNAL_CSS_PROPERTY); return firstToken; }
|
||||
}
|
||||
|
||||
<CSS_VALUE> {
|
||||
{Less_LineCommentBegin} {
|
||||
// This must be before {CSS_Value} since "//" is a valid CSS value
|
||||
if (highlightingLess) {
|
||||
cssPrevState = zzLexicalState;
|
||||
start = zzMarkedPos-2; yybegin(LESS_EOL_COMMENT);
|
||||
}
|
||||
else { // Highlight the "//" as an identifier and continue on
|
||||
int temp = zzStartRead + 2;
|
||||
addToken(zzStartRead, zzStartRead + 1, Token.IDENTIFIER);
|
||||
zzStartRead = temp;
|
||||
}
|
||||
}
|
||||
{CSS_Value} { addToken(Token.IDENTIFIER); }
|
||||
"!important" { addToken(Token.PREPROCESSOR); }
|
||||
{CSS_Function} { int temp = zzMarkedPos - 2;
|
||||
addToken(zzStartRead, temp, Token.FUNCTION);
|
||||
addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
|
||||
zzStartRead = zzCurrentPos = zzMarkedPos;
|
||||
}
|
||||
{CSS_Number} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{CSS_Less_Var} { addToken(highlightingLess ? Token.VARIABLE : Token.IDENTIFIER); }
|
||||
\" { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
|
||||
\' { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
|
||||
")" { /* End of a function */ addToken(Token.SEPARATOR); }
|
||||
[;] { addToken(Token.OPERATOR); yybegin(CSS_PROPERTY); }
|
||||
[,\.] { addToken(Token.IDENTIFIER); }
|
||||
"}" { addToken(Token.SEPARATOR); yybegin(YYINITIAL); }
|
||||
{WhiteSpace} { addToken(Token.WHITESPACE); }
|
||||
{MlcStart} { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
|
||||
. { /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER); }
|
||||
"\n" |
|
||||
<<EOF>> { addEndToken(INTERNAL_CSS_VALUE); return firstToken; }
|
||||
}
|
||||
|
||||
<CSS_STRING> {
|
||||
[^\n\\\"]+ {}
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
\" { addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState); }
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken; }
|
||||
}
|
||||
|
||||
<CSS_CHAR_LITERAL> {
|
||||
[^\n\\\']+ {}
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
\' { addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState); }
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken; }
|
||||
}
|
||||
|
||||
<CSS_C_STYLE_COMMENT> {
|
||||
[^hwf\n\*]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
{MlcEnd} { addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState); }
|
||||
\* {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken; }
|
||||
}
|
||||
|
||||
<LESS_EOL_COMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n |
|
||||
<<EOF>> {
|
||||
addToken(start,zzStartRead-1, Token.COMMENT_EOL);
|
||||
switch (cssPrevState) {
|
||||
case CSS_PROPERTY:
|
||||
addEndToken(INTERNAL_CSS_PROPERTY);
|
||||
break;
|
||||
case CSS_VALUE:
|
||||
addEndToken(INTERNAL_CSS_VALUE);
|
||||
break;
|
||||
default: // Should be YYINITIAL
|
||||
addNullToken();
|
||||
break;
|
||||
}
|
||||
return firstToken;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,514 +0,0 @@
|
||||
/*
|
||||
* 11/13/2004
|
||||
*
|
||||
* CSharpTokenMaker.java - An object that can take a chunk of text and return
|
||||
* a linked list of tokens representing it in the C# programming language.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* A lexer for the C# programming language.
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>CSharpTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class CSharpTokenMaker
|
||||
%extends AbstractJFlexCTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public CSharpTokenMaker() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "//", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = VERBATIMSTRING;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.COMMENT_MULTILINE:
|
||||
state = DELIMITEDCOMMENT;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
/* C1.1 - Line terminators. */
|
||||
NewlineCharacter = ([\n])
|
||||
|
||||
/* C.1.2 - Whitespace. */
|
||||
Whitespace = ([\t ]+)
|
||||
|
||||
/* C.1.3 - Comments */
|
||||
InputCharacter = ([^\n])
|
||||
InputCharacters = ({InputCharacter}+)
|
||||
DocumentationCommentStart = ("///")
|
||||
SingleLineComment = ("//"([^/]{InputCharacters}?)?)
|
||||
DelimitedCommentStart = ("/*")
|
||||
DelimitedCommentEnd = ("*/")
|
||||
|
||||
/* C.1.5 - Unicode character escape sequences. */
|
||||
UnicodeEscape1 = ("\\u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
|
||||
UnicodeEscape2 = ("\\U"{HexDigit}{HexDigit}{HexDigit}{HexDigit}{HexDigit}{HexDigit}{HexDigit}{HexDigit})
|
||||
UnicodeEscapeSequence = ({UnicodeEscape1}|{UnicodeEscape2})
|
||||
|
||||
/* C1.6 - Identifiers. */
|
||||
LetterCharacter = ([A-Za-z]) /* Not accurate - many more Unicode letters, Unicode escapes */
|
||||
/*
|
||||
CombiningCharacter = ()
|
||||
*/
|
||||
DecimalDigitCharacter = ([0-9])
|
||||
ConnectingCharacter = ([_\-])
|
||||
/*
|
||||
FormattingCharacter = ()
|
||||
*/
|
||||
/*
|
||||
IdentifierPartCharacter = ({LetterCharacter}|{DecimalDigitCharacter}|{ConnectingCharacter}|{CombiningCharacter}|{FormattingCharacter})
|
||||
*/
|
||||
IdentifierPartCharacter = ({LetterCharacter}|{DecimalDigitCharacter}|{ConnectingCharacter})
|
||||
IdentifierPartCharacters = ({IdentifierPartCharacter}+)
|
||||
IdentifierStartCharacter = ({LetterCharacter}|[_])
|
||||
IdentifierOrKeyword = ({IdentifierStartCharacter}{IdentifierPartCharacters}?)
|
||||
Identifier = ("@"?{IdentifierOrKeyword})
|
||||
/* NOTE: The two below aren't from the C# spec, but we add them so we can */
|
||||
/* highlight errors. */
|
||||
NonSeparator = (([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\"))
|
||||
ErrorIdentifier = ({NonSeparator}+)
|
||||
|
||||
/* C1.8 - Literals. */
|
||||
BooleanLiteral = ("true"|"false")
|
||||
DecimalDigit = ([0-9])
|
||||
DecimalDigits = ({DecimalDigit}+)
|
||||
IntegerTypeSuffix = (([uU][lL]?)|([lL][uU]?))
|
||||
DecimalIntegerLiteral = ({DecimalDigits}{IntegerTypeSuffix}?)
|
||||
HexDigit = ([0-9A-Fa-f])
|
||||
HexDigits = ({HexDigit}+)
|
||||
HexadecimalIntegerLiteral = ("0"[xX]{HexDigits}{IntegerTypeSuffix}?)
|
||||
Sign = ([+\-])
|
||||
ExponentPart = ([eE]{Sign}?{DecimalDigits})
|
||||
RealTypeSuffix = ([fFdDmM])
|
||||
RealHelper1 = ({DecimalDigits}"."{DecimalDigits}{ExponentPart}?{RealTypeSuffix}?)
|
||||
RealHelper2 = ("."{DecimalDigits}{ExponentPart}?{RealTypeSuffix}?)
|
||||
RealHelper3 = ({DecimalDigits}{ExponentPart}{RealTypeSuffix}?)
|
||||
RealHelper4 = ({DecimalDigits}{RealTypeSuffix})
|
||||
RealLiteral = ({RealHelper1}|{RealHelper2}|{RealHelper3}|{RealHelper4})
|
||||
ErrorNumberFormat = (({DecimalIntegerLiteral}|{HexadecimalIntegerLiteral}|{RealLiteral}){NonSeparator}+)
|
||||
SingleCharacter = ([^\'\\\n])
|
||||
SimpleEscapeSequence = ("\\"[\'\"\\0abfnrtv])
|
||||
HexadecimalEscapeSequence = ("\\x"{HexDigit}{HexDigit}?{HexDigit}?{HexDigit}?)
|
||||
Character = ({SingleCharacter}|{SimpleEscapeSequence}|{HexadecimalEscapeSequence}|{UnicodeEscapeSequence})
|
||||
UnclosedCharacterLiteral = ("'"{Character})
|
||||
CharacterLiteral = ({UnclosedCharacterLiteral}"'")
|
||||
ErrorUnclosedCharacterLiteral = ("'"[^\'\n]*)
|
||||
ErrorCharacterLiteral = ("''"|{ErrorUnclosedCharacterLiteral}[\'])
|
||||
QuoteEscapeSequence = ("\"\"")
|
||||
SingleVerbatimStringLiteralCharacter = ([^\"])
|
||||
VerbatimStringLiteralStart = ("@\"")
|
||||
SingleRegularStringLiteralCharacter = ([^\"\\\n])
|
||||
RegularStringLiteralCharacter = ({SingleRegularStringLiteralCharacter}|{SimpleEscapeSequence}|{HexadecimalEscapeSequence}|{UnicodeEscapeSequence})
|
||||
RegularStringLiteralCharacters = ({RegularStringLiteralCharacter}+)
|
||||
RegularStringLiteral = ([\"]{RegularStringLiteralCharacters}?[\"])
|
||||
UnclosedRegularStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
|
||||
ErrorRegularStringLiteral = ({UnclosedRegularStringLiteral}[\"])
|
||||
|
||||
/* C.1.9 - Operators and Punctuators. */
|
||||
OOPHelper1 = (":")
|
||||
OOPHelper2 = ("+"|"-"|"*"|"/"|"%"|"&"|"|"|"^"|"!"|"~")
|
||||
OOPHelper3 = ("="|"<"|">"|"?"|"++"|"--"|"&&"|"||"|"<<"|">>")
|
||||
OOPHelper4 = ("=="|"!="|"<="|">="|"+="|"-="|"*="|"/="|"%="|"&=")
|
||||
OOPHelper5 = ("|="|"^="|"<<="|">>="|"->")
|
||||
OperatorOrPunctuator = ({OOPHelper1}|{OOPHelper2}|{OOPHelper3}|{OOPHelper4}|{OOPHelper5})
|
||||
/* NOTE: We distinguish between operators and separators (punctuators), but */
|
||||
/* the C# spec doesn't, so the stuff below isn't in the spec. */
|
||||
Separator = ([\{\}\[\]\(\)])
|
||||
Separator2 = ([,;])
|
||||
|
||||
/* C.1.10 - Pre-processing Directives. */
|
||||
/* NOTE: We don't do ALL of the PP stuff here as it's unnecessary */
|
||||
/* for us to know the difference between declarations, diagnostics, */
|
||||
/* regions, etc. */
|
||||
ConditionalSymbol = ({IdentifierOrKeyword}) /* Not correct - excludes "true" and "false". */
|
||||
PPNewLine = ({Whitespace}?{SingleLineComment}?{NewlineCharacter})
|
||||
PPPrimaryExpression = ({IdentifierOrKeyword}|({Whitespace}?{PPExpression}{Whitespace}?))
|
||||
PPUnaryExpression = ({PPPrimaryExpression}|("!"{Whitespace}?{PPUnaryExpression}))
|
||||
PPEqualityExpression = ({PPUnaryExpression}|({Whitespace}?"=="{Whitespace}?{PPUnaryExpression})|({Whitespace}?"!="{Whitespace}?{PPUnaryExpression}))
|
||||
PPAndExpression = ({PPEqualityExpression}|({Whitespace}?"&&"{Whitespace}?{PPEqualityExpression}))
|
||||
PPOrExpression = ({PPAndExpression}|({Whitespace}?"||"{Whitespace}?{PPAndExpression}))
|
||||
PPExpression = ({Whitespace}?{PPOrExpression}{Whitespace}?)
|
||||
PPWord = ("define"|"undef"|"if"|"elif"|"else"|"endif"|"line"|"error"|"warning"|"region"|"endregion")
|
||||
PPDirective = ({Whitespace}?"#"{Whitespace}?{PPWord}{InputCharacter}*)
|
||||
|
||||
/* URL matching, for comments (not in C# spec) */
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ([A-Za-z_]|{DecimalDigitCharacter}|[\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$]|[A-Za-z0-9])
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
|
||||
%state DELIMITEDCOMMENT
|
||||
%state DOCUMENTCOMMENT
|
||||
%state VERBATIMSTRING
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
/* Keywords */
|
||||
"abstract" |
|
||||
"as" |
|
||||
"base" |
|
||||
"break" |
|
||||
"case" |
|
||||
"catch" |
|
||||
"checked" |
|
||||
"class" |
|
||||
"const" |
|
||||
"continue" |
|
||||
"decimal" |
|
||||
"default" |
|
||||
"delegate" |
|
||||
"do" |
|
||||
"else" |
|
||||
"enum" |
|
||||
"event" |
|
||||
"explicit" |
|
||||
"extern" |
|
||||
"finally" |
|
||||
"fixed" |
|
||||
"for" |
|
||||
"foreach" |
|
||||
"goto" |
|
||||
"if" |
|
||||
"implicit" |
|
||||
"in" |
|
||||
"interface" |
|
||||
"internal" |
|
||||
"is" |
|
||||
"lock" |
|
||||
"namespace" |
|
||||
"new" |
|
||||
"null" |
|
||||
"object" |
|
||||
"operator" |
|
||||
"out" |
|
||||
"override" |
|
||||
"params" |
|
||||
"private" |
|
||||
"protected" |
|
||||
"public" |
|
||||
"readonly" |
|
||||
"ref" |
|
||||
"return" |
|
||||
"sealed" |
|
||||
"sizeof" |
|
||||
"stackalloc" |
|
||||
"static" |
|
||||
"string" |
|
||||
"struct" |
|
||||
"switch" |
|
||||
"this" |
|
||||
"throw" |
|
||||
"try" |
|
||||
"typeof" |
|
||||
"unchecked" |
|
||||
"unsafe" |
|
||||
"using" |
|
||||
"virtual" |
|
||||
"void" |
|
||||
"volatile" |
|
||||
"while" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
/* Data types. */
|
||||
"bool" |
|
||||
"byte" |
|
||||
"char" |
|
||||
"double" |
|
||||
"float" |
|
||||
"int" |
|
||||
"long" |
|
||||
"object" |
|
||||
"sbyte" |
|
||||
"short" |
|
||||
"string" |
|
||||
"uint" |
|
||||
"ulong" |
|
||||
"ushort" { addToken(Token.DATA_TYPE); }
|
||||
|
||||
|
||||
{NewlineCharacter} { addNullToken(); return firstToken; }
|
||||
|
||||
{BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
|
||||
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
{Whitespace} { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* String/Character Literals. */
|
||||
{CharacterLiteral} { addToken(Token.LITERAL_CHAR); }
|
||||
{UnclosedCharacterLiteral} { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/ }
|
||||
{ErrorUnclosedCharacterLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
|
||||
{ErrorCharacterLiteral} { addToken(Token.ERROR_CHAR); }
|
||||
{VerbatimStringLiteralStart} { start = zzMarkedPos-2; yybegin(VERBATIMSTRING); }
|
||||
{RegularStringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
{UnclosedRegularStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
{ErrorRegularStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
|
||||
|
||||
/* Comments. */
|
||||
{DelimitedCommentStart} { start = zzMarkedPos-2; yybegin(DELIMITEDCOMMENT); }
|
||||
{DocumentationCommentStart} { start = zzMarkedPos-3; yybegin(DOCUMENTCOMMENT); }
|
||||
{SingleLineComment} { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
|
||||
/* Separators. */
|
||||
{Separator} { addToken(Token.SEPARATOR); }
|
||||
{Separator2} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
/* Operators. */
|
||||
{OperatorOrPunctuator} { addToken(Token.OPERATOR); }
|
||||
|
||||
/* Numbers */
|
||||
{DecimalIntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{HexadecimalIntegerLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
|
||||
{RealLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
{ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
|
||||
|
||||
/* Preprocessor directives. */
|
||||
{PPDirective} { addToken(Token.PREPROCESSOR); }
|
||||
|
||||
/* Pretty-much anything else. */
|
||||
{ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters and flag them as bad. */
|
||||
. { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<DELIMITEDCOMMENT> {
|
||||
|
||||
[^hwf\n\*]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
{DelimitedCommentEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
|
||||
\* {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<DOCUMENTCOMMENT> {
|
||||
|
||||
[^hwf\<\n]* {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addNullToken(); return firstToken; }
|
||||
"<"[^\>]*">" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.PREPROCESSOR); start = zzMarkedPos; }
|
||||
"<" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzEndRead, Token.PREPROCESSOR); addNullToken(); return firstToken; }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addNullToken(); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<VERBATIMSTRING> {
|
||||
|
||||
[^\"\n]* {}
|
||||
{QuoteEscapeSequence} {}
|
||||
\" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,647 +0,0 @@
|
||||
/*
|
||||
* 11/13/2004
|
||||
*
|
||||
* CTokenMaker.java - An object that can take a chunk of text and
|
||||
* return a linked list of tokens representing it in the C programming
|
||||
* language.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for the C programming language.
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>CTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.6
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class CTokenMaker
|
||||
%extends AbstractJFlexCTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public CTokenMaker() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "//", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.COMMENT_MULTILINE:
|
||||
state = MLC;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Letter = [A-Za-z]
|
||||
LetterOrUnderscore = ({Letter}|[_])
|
||||
Digit = [0-9]
|
||||
HexDigit = {Digit}|[A-Fa-f]
|
||||
OctalDigit = [0-7]
|
||||
Exponent = [eE][+-]?{Digit}+
|
||||
|
||||
PreprocessorWord = define|elif|else|endif|error|if|ifdef|ifndef|include|line|pragma|undef
|
||||
|
||||
Trigraph = ("??="|"??("|"??)"|"??/"|"??'"|"??<"|"??>"|"??!"|"??-")
|
||||
|
||||
OctEscape1 = ([\\]{OctalDigit})
|
||||
OctEscape2 = ([\\]{OctalDigit}{OctalDigit})
|
||||
OctEscape3 = ([\\][0-3]{OctalDigit}{OctalDigit})
|
||||
OctEscape = ({OctEscape1}|{OctEscape2}|{OctEscape3})
|
||||
HexEscape = ([\\][xX]{HexDigit}{HexDigit})
|
||||
|
||||
AnyChrChr = ([^\'\n\\])
|
||||
Escape = ([\\]([abfnrtv\'\"\?\\0e]))
|
||||
UnclosedCharLiteral = ([\']({Escape}|{OctEscape}|{HexEscape}|{Trigraph}|{AnyChrChr}))
|
||||
CharLiteral = ({UnclosedCharLiteral}[\'])
|
||||
ErrorUnclosedCharLiteral = ([\'][^\'\n]*)
|
||||
ErrorCharLiteral = (([\'][\'])|{ErrorUnclosedCharLiteral}[\'])
|
||||
AnyStrChr = ([^\"\n\\])
|
||||
FalseTrigraph = (("?"(("?")*)[^\=\(\)\/\'\<\>\!\-\\\?\"\n])|("?"[\=\(\)\/\'\<\>\!\-]))
|
||||
StringLiteral = ([\"]((((("?")*)({Escape}|{OctEscape}|{HexEscape}|{Trigraph}))|{FalseTrigraph}|{AnyStrChr})*)(("?")*)[\"])
|
||||
UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
|
||||
ErrorStringLiteral = ({UnclosedStringLiteral}[\"])
|
||||
|
||||
|
||||
LineTerminator = \n
|
||||
WhiteSpace = [ \t\f]
|
||||
|
||||
MLCBegin = "/*"
|
||||
MLCEnd = "*/"
|
||||
LineCommentBegin = "//"
|
||||
|
||||
NonFloatSuffix = (([uU][lL]?)|([lL][uU]?))
|
||||
IntegerLiteral = ({Digit}+{Exponent}?{NonFloatSuffix}?)
|
||||
HexLiteral = ("0"[xX]{HexDigit}+{NonFloatSuffix}?)
|
||||
FloatLiteral = ((({Digit}*[\.]{Digit}+)|({Digit}+[\.]{Digit}*)){Exponent}?[fFlL]?)
|
||||
ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
|
||||
|
||||
NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#")
|
||||
Identifier = ({LetterOrUnderscore}({LetterOrUnderscore}|{Digit}|[$])*)
|
||||
ErrorIdentifier = ({NonSeparator}+)
|
||||
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$]|{Letter}|{Digit})
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
%state MLC
|
||||
%state EOL_COMMENT
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
/* Keywords */
|
||||
"auto" |
|
||||
"break" |
|
||||
"case" |
|
||||
"const" |
|
||||
"continue" |
|
||||
"default" |
|
||||
"do" |
|
||||
"else" |
|
||||
"enum" |
|
||||
"extern" |
|
||||
"for" |
|
||||
"goto" |
|
||||
"if" |
|
||||
"register" |
|
||||
"sizeof" |
|
||||
"static" |
|
||||
"struct" |
|
||||
"switch" |
|
||||
"typedef" |
|
||||
"union" |
|
||||
"volatile" |
|
||||
"while" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
"return" { addToken(Token.RESERVED_WORD_2); }
|
||||
|
||||
/* Data types. */
|
||||
"char" |
|
||||
"div_t" |
|
||||
"double" |
|
||||
"float" |
|
||||
"int" |
|
||||
"ldiv_t" |
|
||||
"long" |
|
||||
"short" |
|
||||
"signed" |
|
||||
"size_t" |
|
||||
"unsigned" |
|
||||
"void" |
|
||||
"wchar_t" { addToken(Token.DATA_TYPE); }
|
||||
|
||||
/* Standard functions */
|
||||
"abort" |
|
||||
"abs" |
|
||||
"acos" |
|
||||
"asctime" |
|
||||
"asin" |
|
||||
"assert" |
|
||||
"atan2" |
|
||||
"atan" |
|
||||
"atexit" |
|
||||
"atof" |
|
||||
"atoi" |
|
||||
"atol" |
|
||||
"bsearch" |
|
||||
"btowc" |
|
||||
"calloc" |
|
||||
"ceil" |
|
||||
"clearerr" |
|
||||
"clock" |
|
||||
"cosh" |
|
||||
"cos" |
|
||||
"ctime" |
|
||||
"difftime" |
|
||||
"div" |
|
||||
"errno" |
|
||||
"exit" |
|
||||
"exp" |
|
||||
"fabs" |
|
||||
"fclose" |
|
||||
"feof" |
|
||||
"ferror" |
|
||||
"fflush" |
|
||||
"fgetc" |
|
||||
"fgetpos" |
|
||||
"fgetwc" |
|
||||
"fgets" |
|
||||
"fgetws" |
|
||||
"floor" |
|
||||
"fmod" |
|
||||
"fopen" |
|
||||
"fprintf" |
|
||||
"fputc" |
|
||||
"fputs" |
|
||||
"fputwc" |
|
||||
"fputws" |
|
||||
"fread" |
|
||||
"free" |
|
||||
"freopen" |
|
||||
"frexp" |
|
||||
"fscanf" |
|
||||
"fseek" |
|
||||
"fsetpos" |
|
||||
"ftell" |
|
||||
"fwprintf" |
|
||||
"fwrite" |
|
||||
"fwscanf" |
|
||||
"getchar" |
|
||||
"getc" |
|
||||
"getenv" |
|
||||
"gets" |
|
||||
"getwc" |
|
||||
"getwchar" |
|
||||
"gmtime" |
|
||||
"isalnum" |
|
||||
"isalpha" |
|
||||
"iscntrl" |
|
||||
"isdigit" |
|
||||
"isgraph" |
|
||||
"islower" |
|
||||
"isprint" |
|
||||
"ispunct" |
|
||||
"isspace" |
|
||||
"isupper" |
|
||||
"isxdigit" |
|
||||
"labs" |
|
||||
"ldexp" |
|
||||
"ldiv" |
|
||||
"localeconv" |
|
||||
"localtime" |
|
||||
"log10" |
|
||||
"log" |
|
||||
"longjmp" |
|
||||
"malloc" |
|
||||
"mblen" |
|
||||
"mbrlen" |
|
||||
"mbrtowc" |
|
||||
"mbsinit" |
|
||||
"mbsrtowcs" |
|
||||
"mbstowcs" |
|
||||
"mbtowc" |
|
||||
"memchr" |
|
||||
"memcmp" |
|
||||
"memcpy" |
|
||||
"memmove" |
|
||||
"memset" |
|
||||
"mktime" |
|
||||
"modf" |
|
||||
"offsetof" |
|
||||
"perror" |
|
||||
"pow" |
|
||||
"printf" |
|
||||
"putchar" |
|
||||
"putc" |
|
||||
"puts" |
|
||||
"putwc" |
|
||||
"putwchar" |
|
||||
"qsort" |
|
||||
"raise" |
|
||||
"rand" |
|
||||
"realloc" |
|
||||
"remove" |
|
||||
"rename" |
|
||||
"rewind" |
|
||||
"scanf" |
|
||||
"setbuf" |
|
||||
"setjmp" |
|
||||
"setlocale" |
|
||||
"setvbuf" |
|
||||
"setvbuf" |
|
||||
"signal" |
|
||||
"sinh" |
|
||||
"sin" |
|
||||
"sprintf" |
|
||||
"sqrt" |
|
||||
"srand" |
|
||||
"sscanf" |
|
||||
"strcat" |
|
||||
"strchr" |
|
||||
"strcmp" |
|
||||
"strcmp" |
|
||||
"strcoll" |
|
||||
"strcpy" |
|
||||
"strcspn" |
|
||||
"strerror" |
|
||||
"strftime" |
|
||||
"strlen" |
|
||||
"strncat" |
|
||||
"strncmp" |
|
||||
"strncpy" |
|
||||
"strpbrk" |
|
||||
"strrchr" |
|
||||
"strspn" |
|
||||
"strstr" |
|
||||
"strtod" |
|
||||
"strtok" |
|
||||
"strtol" |
|
||||
"strtoul" |
|
||||
"strxfrm" |
|
||||
"swprintf" |
|
||||
"swscanf" |
|
||||
"system" |
|
||||
"tanh" |
|
||||
"tan" |
|
||||
"time" |
|
||||
"tmpfile" |
|
||||
"tmpnam" |
|
||||
"tolower" |
|
||||
"toupper" |
|
||||
"ungetc" |
|
||||
"ungetwc" |
|
||||
"va_arg" |
|
||||
"va_end" |
|
||||
"va_start" |
|
||||
"vfprintf" |
|
||||
"vfwprintf" |
|
||||
"vprintf" |
|
||||
"vsprintf" |
|
||||
"vswprintf" |
|
||||
"vwprintf" |
|
||||
"wcrtomb" |
|
||||
"wcscat" |
|
||||
"wcschr" |
|
||||
"wcscmp" |
|
||||
"wcscoll" |
|
||||
"wcscpy" |
|
||||
"wcscspn" |
|
||||
"wcsftime" |
|
||||
"wcslen" |
|
||||
"wcsncat" |
|
||||
"wcsncmp" |
|
||||
"wcsncpy" |
|
||||
"wcspbrk" |
|
||||
"wcsrchr" |
|
||||
"wcsrtombs" |
|
||||
"wcsspn" |
|
||||
"wcsstr" |
|
||||
"wcstod" |
|
||||
"wcstok" |
|
||||
"wcstol" |
|
||||
"wcstombs" |
|
||||
"wcstoul" |
|
||||
"wcsxfrm" |
|
||||
"wctob" |
|
||||
"wctomb" |
|
||||
"wmemchr" |
|
||||
"wmemcmp" |
|
||||
"wmemcpy" |
|
||||
"wmemmove" |
|
||||
"wmemset" |
|
||||
"wprintf" |
|
||||
"wscanf" { addToken(Token.FUNCTION); }
|
||||
|
||||
/* Standard-defined macros. */
|
||||
"__DATE__" |
|
||||
"__TIME__" |
|
||||
"__FILE__" |
|
||||
"__LINE__" |
|
||||
"__STDC__" { addToken(Token.PREPROCESSOR); }
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
{WhiteSpace}+ { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* Preprocessor directives */
|
||||
"#"{WhiteSpace}*{PreprocessorWord} { addToken(Token.PREPROCESSOR); }
|
||||
|
||||
/* String/Character Literals. */
|
||||
{CharLiteral} { addToken(Token.LITERAL_CHAR); }
|
||||
{UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/ }
|
||||
{ErrorUnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
|
||||
{ErrorCharLiteral} { addToken(Token.ERROR_CHAR); }
|
||||
{StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
{UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
{ErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
|
||||
|
||||
/* Comment Literals. */
|
||||
{MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
|
||||
{LineCommentBegin} { start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
|
||||
|
||||
/* Separators. */
|
||||
"(" |
|
||||
")" |
|
||||
"[" |
|
||||
"]" |
|
||||
"{" |
|
||||
"}" { addToken(Token.SEPARATOR); }
|
||||
|
||||
/* Operators. */
|
||||
{Trigraph} |
|
||||
"=" |
|
||||
"+" |
|
||||
"-" |
|
||||
"*" |
|
||||
"/" |
|
||||
"%" |
|
||||
"~" |
|
||||
"<" |
|
||||
">" |
|
||||
"<<" |
|
||||
">>" |
|
||||
"==" |
|
||||
"+=" |
|
||||
"-=" |
|
||||
"*=" |
|
||||
"/=" |
|
||||
"%=" |
|
||||
"&=" |
|
||||
"|=" |
|
||||
"^=" |
|
||||
">=" |
|
||||
"<=" |
|
||||
"!=" |
|
||||
">>=" |
|
||||
"<<=" |
|
||||
"^" |
|
||||
"&" |
|
||||
"&&" |
|
||||
"|" |
|
||||
"||" |
|
||||
"?" |
|
||||
":" |
|
||||
"," |
|
||||
"!" |
|
||||
"++" |
|
||||
"--" |
|
||||
"." |
|
||||
"," { addToken(Token.OPERATOR); }
|
||||
|
||||
/* Numbers */
|
||||
{IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
|
||||
{FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
{ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
|
||||
|
||||
/* Some lines will end in '\' to wrap an expression. */
|
||||
"\\" { addToken(Token.IDENTIFIER); }
|
||||
|
||||
{ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
/* Other punctuation, we'll highlight it as "identifiers." */
|
||||
";" { addToken(Token.IDENTIFIER); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters and flag them as bad. */
|
||||
. { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
<MLC> {
|
||||
|
||||
[^hwf\n\*]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
{MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
|
||||
\* {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<EOL_COMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,561 +0,0 @@
|
||||
/*
|
||||
* 12/23/2010
|
||||
*
|
||||
* ClojureTokenMaker.java - Scanner for Clojure.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for the Clojure programming language.<p>
|
||||
*
|
||||
* The original version of this class was graciously donated by the folks at the
|
||||
* <a href="http://pacific.mpi-cbg.de/wiki/index.php/Fiji">Fiji</a> project.
|
||||
* This version has been modified to fix a few issues.
|
||||
* Its original location was
|
||||
* <a href="http://pacific.mpi-cbg.de/cgi-bin/gitweb.cgi?p=fiji.git;a=tree;f=src-plugins/Script_Editor/fiji/scripting;hb=935d85d9d88dd780c6d5f2765937ddc18b5008ca">here</a>.
|
||||
* <p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>ClojureTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class ClojureTokenMaker
|
||||
%extends AbstractJFlexTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public ClojureTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addHyperlinkToken(int, int, int)
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
* @param hyperlink Whether this token is a hyperlink.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType,
|
||||
int startOffset, boolean hyperlink) {
|
||||
super.addToken(array, start,end, tokenType, startOffset, hyperlink);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { ";", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
/*case Token.COMMENT_MULTILINE:
|
||||
state = MLC;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.COMMENT_DOCUMENTATION:
|
||||
state = DOCCOMMENT;
|
||||
start = text.offset;
|
||||
break;*/
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = STRING;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
|
||||
LineCommentBegin = (";")
|
||||
Keyword = ([:][a-zA-Z?!\-+*/][a-zA-Z0-9?!\-+*/]*)
|
||||
NonzeroDigit = [1-9]
|
||||
Digit = ("0"|{NonzeroDigit})
|
||||
HexDigit = ({Digit}|[A-Fa-f])
|
||||
OctalDigit = ([0-7])
|
||||
EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
|
||||
Escape = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
|
||||
AnyCharacterButDoubleQuoteOrBackSlash = ([^\\\"\n])
|
||||
StringLiteralStart = ([\"])
|
||||
CharLiteral = ("\\."|"\\space"|"\\tab"|"\\newline")
|
||||
AnyCharacter = ([.]*)
|
||||
Separator = ([\(\)\{\}\[\]])
|
||||
NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\'])
|
||||
|
||||
BooleanLiteral =("true"|"false")
|
||||
|
||||
LineTerminator = (\n)
|
||||
WhiteSpace = ([ \t\f])
|
||||
|
||||
IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
|
||||
IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
|
||||
IntegerLiteral = ({IntegerHelper1}[lL]?)
|
||||
HexLiteral = ({IntegerHelper2}[lL]?)
|
||||
FloatHelper1 = ([fFdD]?)
|
||||
FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
|
||||
FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
|
||||
FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
|
||||
FloatLiteral3 = ({Digit}+{FloatHelper2})
|
||||
FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
|
||||
ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
|
||||
|
||||
|
||||
Nil = ("nil")
|
||||
Quote = (\('\|`\))
|
||||
Unquote = (\(\~@\|\~\))
|
||||
DispatchStart = ("#^"|"#^{")
|
||||
Dispatch = ({DispatchStart}[^\s\t\n;\"}]*([ \t\n;\"]|"}"))
|
||||
VarQuote = ("#'"[.]*[ \t\n;(\"])
|
||||
DefName = ([a-zA-Z0-9?!\-+*\./<>_]*)
|
||||
|
||||
NonAssignmentOperator = ("+"|"-"|"<="|"^"|"<"|"*"|">="|"%"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|">>>")
|
||||
AssignmentOperator = ("=")
|
||||
Operator = ({NonAssignmentOperator}|{AssignmentOperator})
|
||||
|
||||
Letter = [A-Za-z]
|
||||
LetterOrUnderscore = ({Letter}|[_])
|
||||
Digit = [0-9]
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$]|{Letter}|{Digit})
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
|
||||
%state STRING
|
||||
%state EOL_COMMENT
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
"case" |
|
||||
"class" |
|
||||
"cond" |
|
||||
"condp" |
|
||||
"def" |
|
||||
"defmacro" |
|
||||
"defn" |
|
||||
"do" |
|
||||
"fn" |
|
||||
"for" |
|
||||
"if" |
|
||||
"if-let" |
|
||||
"if-not" |
|
||||
"instance?" |
|
||||
"let" |
|
||||
"loop" |
|
||||
"monitor-enter" |
|
||||
"monitor-exit" |
|
||||
"new" |
|
||||
"quote" |
|
||||
"recur" |
|
||||
"set!" |
|
||||
"this" |
|
||||
"throw" |
|
||||
"try-finally" |
|
||||
"var" |
|
||||
"when" |
|
||||
"when-first" |
|
||||
"when-let" |
|
||||
"when-not" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
"*warn-on-reflection*" |
|
||||
"*1" |
|
||||
"*2" |
|
||||
"*3" |
|
||||
"*agent*" |
|
||||
"*allow-unresolved-args*" |
|
||||
"*assert*" |
|
||||
"*clojure-version*" |
|
||||
"*command-line-args*" |
|
||||
"*compile-files*" |
|
||||
"*compile-path*" |
|
||||
"*e" |
|
||||
"*err*" |
|
||||
"*file*" |
|
||||
"*flush-on-newline*" |
|
||||
"*fn-loader*" |
|
||||
"*in*" |
|
||||
"*math-context*" |
|
||||
"*ns*" |
|
||||
"*out*" |
|
||||
"*print-dup*" |
|
||||
"*print-length*" |
|
||||
"*print-level*" |
|
||||
"*print-meta*" |
|
||||
"*print-readably*" |
|
||||
"*read-eval*" |
|
||||
"*source-path*" |
|
||||
"*unchecked-math*" |
|
||||
"*use-context-classloader*" { addToken(Token.VARIABLE); }
|
||||
|
||||
"*current-namespace*" |
|
||||
"*in*" |
|
||||
"*out*" |
|
||||
"*print-meta*" |
|
||||
"->" |
|
||||
".." |
|
||||
"agent" |
|
||||
"agent-errors" |
|
||||
"agent-of" |
|
||||
"aget" |
|
||||
"alter" |
|
||||
"and" |
|
||||
"any" |
|
||||
"appl" |
|
||||
"apply" |
|
||||
"array" |
|
||||
"aset" |
|
||||
"aset-boolean" |
|
||||
"aset-byte" |
|
||||
"aset-double" |
|
||||
"aset-float" |
|
||||
"aset-int" |
|
||||
"aset-long" |
|
||||
"aset-short" |
|
||||
"assoc" |
|
||||
"binding" |
|
||||
"boolean" |
|
||||
"byte" |
|
||||
"char" |
|
||||
"clear-agent-errors" |
|
||||
"commute" |
|
||||
"comp" |
|
||||
"complement" |
|
||||
"concat" |
|
||||
"conj" |
|
||||
"cons" |
|
||||
"constantly" |
|
||||
"count" |
|
||||
"cycle" |
|
||||
"dec" |
|
||||
"defmethod" |
|
||||
"defmulti" |
|
||||
"delay" |
|
||||
"deref" |
|
||||
"dissoc" |
|
||||
"doseq" |
|
||||
"dotimes" |
|
||||
"doto" |
|
||||
"double" |
|
||||
"drop" |
|
||||
"drop-while" |
|
||||
"ensure" |
|
||||
"eql-ref?" |
|
||||
"eql?" |
|
||||
"eval" |
|
||||
"every" |
|
||||
"ffirst" |
|
||||
"filter" |
|
||||
"find" |
|
||||
"find-var" |
|
||||
"first" |
|
||||
"float" |
|
||||
"fnseq" |
|
||||
"frest" |
|
||||
"gensym" |
|
||||
"get" |
|
||||
"hash-map" |
|
||||
"identity" |
|
||||
"implement" |
|
||||
"import" |
|
||||
"in-namespace" |
|
||||
"inc" |
|
||||
"int" |
|
||||
"into" |
|
||||
"into-array" |
|
||||
"iterate" |
|
||||
"key" |
|
||||
"keys" |
|
||||
"lazy-cons" |
|
||||
"list" |
|
||||
"list*" |
|
||||
"load-file" |
|
||||
"locking" |
|
||||
"long" |
|
||||
"make-array" |
|
||||
"make-proxy" |
|
||||
"map" |
|
||||
"mapcat" |
|
||||
"max" |
|
||||
"memfn" |
|
||||
"merge" |
|
||||
"meta" |
|
||||
"min" |
|
||||
"name" |
|
||||
"namespace" |
|
||||
"neg?" |
|
||||
"newline" |
|
||||
"nil?" |
|
||||
"not" |
|
||||
"not-any" |
|
||||
"not-every" |
|
||||
"nth" |
|
||||
"or" |
|
||||
"peek" |
|
||||
"pmap" |
|
||||
"pop" |
|
||||
"pos?" |
|
||||
"print" |
|
||||
"prn" |
|
||||
"quot" |
|
||||
"range" |
|
||||
"read" |
|
||||
"reduce" |
|
||||
"ref" |
|
||||
"refer" |
|
||||
"rem" |
|
||||
"remove-method" |
|
||||
"repeat" |
|
||||
"replicate" |
|
||||
"rest" |
|
||||
"reverse" |
|
||||
"rfirst" |
|
||||
"rrest" |
|
||||
"rseq" |
|
||||
"second" |
|
||||
"seq" |
|
||||
"set" |
|
||||
"short" |
|
||||
"sorted-map" |
|
||||
"sorted-map-by" |
|
||||
"split-at" |
|
||||
"split-with" |
|
||||
"str" |
|
||||
"strcat" |
|
||||
"sym" |
|
||||
"sync" |
|
||||
"take" |
|
||||
"take-while" |
|
||||
"time" |
|
||||
"unimport" |
|
||||
"unintern" |
|
||||
"unrefer" |
|
||||
"val" |
|
||||
"vals" |
|
||||
"vector" |
|
||||
"with-meta" |
|
||||
"zero?" |
|
||||
"zipmap" { addToken(Token.FUNCTION); }
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
|
||||
{WhiteSpace}+ { addToken(Token.WHITESPACE); }
|
||||
|
||||
{CharLiteral} { addToken(Token.LITERAL_CHAR); }
|
||||
{StringLiteralStart} { start = zzMarkedPos-1; yybegin(STRING); }
|
||||
|
||||
{Nil} { addToken(Token.DATA_TYPE); }
|
||||
|
||||
{BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
|
||||
|
||||
|
||||
{Quote} { addToken(Token.SEPARATOR); }
|
||||
{Unquote} { addToken(Token.SEPARATOR); }
|
||||
{VarQuote} { addToken(Token.SEPARATOR); }
|
||||
{Dispatch} { addToken(Token.DATA_TYPE); }
|
||||
|
||||
{LineCommentBegin} { start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
|
||||
|
||||
{Separator} { addToken(Token.SEPARATOR); }
|
||||
|
||||
{Operator} { addToken(Token.OPERATOR); }
|
||||
|
||||
{IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
|
||||
{FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
{ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
|
||||
{Keyword} { addToken(Token.PREPROCESSOR); }
|
||||
{DefName} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
. { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
<STRING> {
|
||||
[^\n\\\"]+ {}
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
\"\" {}
|
||||
\" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
}
|
||||
|
||||
<EOL_COMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,663 +0,0 @@
|
||||
/*
|
||||
* 09/08/2014
|
||||
*
|
||||
* DTokenMaker.java - Scanner for the D programming language.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for the D programming language.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>DTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 1.0
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class DTokenMaker
|
||||
%extends AbstractJFlexCTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Token type specific to DTokenMaker; this signals that the user is in
|
||||
* a nestable multi-line comment. The nested depth is embedded in the
|
||||
* actual end token type.
|
||||
*/
|
||||
private static final int INTERNAL_IN_NESTABLE_MLC = -(1<<11);
|
||||
|
||||
/**
|
||||
* When in a (possibly) nested MLC, this is the current nested depth.
|
||||
*/
|
||||
private int nestedMlcDepth;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public DTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens as an
|
||||
* "end token;" that is, at <code>zzMarkedPos</code>.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addEndToken(int tokenType) {
|
||||
addToken(zzMarkedPos,zzMarkedPos, tokenType);
|
||||
}
|
||||
|
||||
|
||||
private void addNestedMlcEndToken() {
|
||||
addEndToken(INTERNAL_IN_NESTABLE_MLC - nestedMlcDepth);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addHyperlinkToken(int, int, int)
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
* @param hyperlink Whether this token is a hyperlink.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType,
|
||||
int startOffset, boolean hyperlink) {
|
||||
super.addToken(array, start,end, tokenType, startOffset, hyperlink);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getClosestStandardTokenTypeForInternalType(int type) {
|
||||
switch (type) {
|
||||
case INTERNAL_IN_NESTABLE_MLC:
|
||||
return TokenTypes.COMMENT_MULTILINE;
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "//", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
nestedMlcDepth = 0;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = YYINITIAL;
|
||||
switch (initialTokenType) {
|
||||
case Token.LITERAL_BACKQUOTE:
|
||||
state = WYSIWYG_STRING_2;
|
||||
break;
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = WYSIWYG_STRING_1;
|
||||
break;
|
||||
case Token.COMMENT_MULTILINE:
|
||||
state = MLC;
|
||||
break;
|
||||
case Token.COMMENT_DOCUMENTATION:
|
||||
state = DOCCOMMENT;
|
||||
break;
|
||||
case INTERNAL_IN_NESTABLE_MLC:
|
||||
state = NESTABLE_MLC;
|
||||
break;
|
||||
default:
|
||||
if (initialTokenType<-1024) {
|
||||
int main = -(-initialTokenType & 0xffffff00);
|
||||
switch (main) {
|
||||
default: // Should never happen
|
||||
case INTERNAL_IN_NESTABLE_MLC:
|
||||
state = NESTABLE_MLC;
|
||||
break;
|
||||
}
|
||||
nestedMlcDepth = -initialTokenType&0xff;
|
||||
}
|
||||
else {
|
||||
state = YYINITIAL;
|
||||
}
|
||||
}
|
||||
|
||||
start = text.offset;
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
* @exception IOException if any I/O-Error occurs.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Letter = ([A-Za-z])
|
||||
LetterOrUnderscore = ({Letter}|"_")
|
||||
NonzeroDigit = ([1-9])
|
||||
BinaryDigit = ([0-1])
|
||||
Digit = ("0"|{NonzeroDigit})
|
||||
HexDigit = ({Digit}|[A-Fa-f])
|
||||
OctalDigit = ([0-7])
|
||||
AnyCharacterButApostropheOrBackSlash = ([^\\'])
|
||||
AnyCharacterButDoubleQuoteOrBackSlash = ([^\\\"\n])
|
||||
EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
|
||||
Escape = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
|
||||
NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\'\`]|"#"|"\\")
|
||||
IdentifierStart = ({LetterOrUnderscore}|"$")
|
||||
IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
|
||||
|
||||
LineTerminator = (\n)
|
||||
WhiteSpace = ([ \t\f])
|
||||
|
||||
StringPostfix = ([cwd])
|
||||
CharLiteral = ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})[\']{StringPostfix}?)
|
||||
UnclosedCharLiteral = ([\'][^\'\n]*)
|
||||
ErrorCharLiteral = ({UnclosedCharLiteral}[\']{StringPostfix}?)
|
||||
StringLiteral = ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"]{StringPostfix}?)
|
||||
UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
|
||||
HexStringLiteral = ([x]{StringLiteral})
|
||||
UnclosedHexStringLiteral = ([x]{UnclosedStringLiteral})
|
||||
ErrorStringLiteral = ({UnclosedStringLiteral}[\"]{StringPostfix}?)
|
||||
WysiwygStringLiteralStart = ("r"[\"])
|
||||
WysiwygStringLiteralStart2 = ("`")
|
||||
|
||||
MLCBegin = "/*"
|
||||
MLCEnd = "*/"
|
||||
DocCommentBegin = "/**"
|
||||
NestableMLCBegin = "/+"
|
||||
LineCommentBegin = "//"
|
||||
LineDocCommentBegin = "///"
|
||||
|
||||
DigitOrUnderscore = ({Digit}|[_])
|
||||
DigitsAndUnderscoresEnd = ({DigitOrUnderscore}*{Digit})
|
||||
IntegerHelper = (({NonzeroDigit}{DigitsAndUnderscoresEnd}?)|"0")
|
||||
IntegerLiteral = ({IntegerHelper}[lL]?)
|
||||
|
||||
BinaryDigitOrUnderscore = ({BinaryDigit}|[_])
|
||||
BinaryDigitsAndUnderscores = ({BinaryDigit}({BinaryDigitOrUnderscore}*{BinaryDigit})?)
|
||||
BinaryLiteral = ("0"[bB]{BinaryDigitsAndUnderscores})
|
||||
|
||||
HexDigitOrUnderscore = ({HexDigit}|[_])
|
||||
HexDigitsAndUnderscores = ({HexDigit}({HexDigitOrUnderscore}*{HexDigit})?)
|
||||
OctalDigitOrUnderscore = ({OctalDigit}|[_])
|
||||
OctalDigitsAndUnderscoresEnd= ({OctalDigitOrUnderscore}*{OctalDigit})
|
||||
HexHelper = ("0"(([xX]{HexDigitsAndUnderscores})|({OctalDigitsAndUnderscoresEnd})))
|
||||
NonFloatSuffix = (([uU][lL]?)|([lL][uU]?))
|
||||
HexLiteral = ({HexHelper}{NonFloatSuffix}?)
|
||||
|
||||
FloatHelper1 = ([fFdD]?)
|
||||
FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
|
||||
FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
|
||||
FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
|
||||
FloatLiteral3 = ({Digit}+{FloatHelper2})
|
||||
FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
|
||||
|
||||
ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
|
||||
BooleanLiteral = ("true"|"false")
|
||||
|
||||
Separator = ([\(\)\{\}\[\]])
|
||||
Separator2 = ([\;,.])
|
||||
|
||||
NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
|
||||
AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
|
||||
Operator = ({NonAssignmentOperator}|{AssignmentOperator})
|
||||
|
||||
Identifier = ({IdentifierStart}{IdentifierPart}*)
|
||||
ErrorIdentifier = ({NonSeparator}+)
|
||||
|
||||
Annotation = ("@"{Identifier}?)
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$]|{Letter}|{Digit})
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
|
||||
%state MLC
|
||||
%state DOCCOMMENT
|
||||
%state NESTABLE_MLC
|
||||
%state EOL_COMMENT
|
||||
%state EOL_DOCCOMMENT
|
||||
%state WYSIWYG_STRING_1
|
||||
%state WYSIWYG_STRING_2
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
/* Keywords */
|
||||
"abstract" |
|
||||
"alias" |
|
||||
"align" |
|
||||
"asm" |
|
||||
"assert" |
|
||||
"auto" |
|
||||
|
||||
"body" |
|
||||
"break" |
|
||||
|
||||
"case" |
|
||||
"cast" |
|
||||
"catch" |
|
||||
"class" |
|
||||
"const" |
|
||||
"continue" |
|
||||
|
||||
"debug" |
|
||||
"default" |
|
||||
"delegate" |
|
||||
"delete" |
|
||||
"deprecated" |
|
||||
"do" |
|
||||
|
||||
"else" |
|
||||
"enum" |
|
||||
"export" |
|
||||
"extern" |
|
||||
|
||||
"final" |
|
||||
"finally" |
|
||||
"for" |
|
||||
"foreach" |
|
||||
"foreach_reverse" |
|
||||
"function" |
|
||||
|
||||
"goto" |
|
||||
|
||||
"if" |
|
||||
"immutable" |
|
||||
"import" |
|
||||
"in" |
|
||||
"inout" |
|
||||
"interface" |
|
||||
"invariant" |
|
||||
"is" |
|
||||
|
||||
"lazy" |
|
||||
|
||||
"macro" |
|
||||
"mixin" |
|
||||
"module" |
|
||||
|
||||
"new" |
|
||||
"nothrow" |
|
||||
"null" |
|
||||
|
||||
"out" |
|
||||
"override" |
|
||||
|
||||
"package" |
|
||||
"pragma" |
|
||||
"private" |
|
||||
"protected" |
|
||||
"public" |
|
||||
"pure" |
|
||||
|
||||
"ref" |
|
||||
|
||||
"scope" |
|
||||
"shared" |
|
||||
"static" |
|
||||
"struct" |
|
||||
"super" |
|
||||
"switch" |
|
||||
"synchronized" |
|
||||
|
||||
"template" |
|
||||
"this" |
|
||||
"throw" |
|
||||
"try" |
|
||||
"typedef" |
|
||||
"typeid" |
|
||||
"typeof" |
|
||||
|
||||
"union" |
|
||||
"unittest" |
|
||||
|
||||
"version" |
|
||||
"void" |
|
||||
"volatile" |
|
||||
|
||||
"while" |
|
||||
"with" |
|
||||
|
||||
"__FILE__" |
|
||||
"__MODULE__" |
|
||||
"__LINE__" |
|
||||
"__FUNCTION__" |
|
||||
"__PRETTY_FUNCTION__" |
|
||||
|
||||
"__gshared" |
|
||||
"__traits" |
|
||||
"__vector" |
|
||||
"__parameters" { addToken(Token.RESERVED_WORD); }
|
||||
"return" { addToken(Token.RESERVED_WORD_2); }
|
||||
|
||||
/* Data types. */
|
||||
"string" |
|
||||
"wstring" |
|
||||
"dstring" |
|
||||
"size_t" |
|
||||
"ptrdiff_t" |
|
||||
"bool" |
|
||||
"byte" |
|
||||
"cdouble" |
|
||||
"cent" |
|
||||
"cfloat" |
|
||||
"char" |
|
||||
"creal" |
|
||||
"dchar" |
|
||||
"double" |
|
||||
"float" |
|
||||
"idouble" |
|
||||
"ifloat" |
|
||||
"ireal" |
|
||||
"int" |
|
||||
"long" |
|
||||
"real" |
|
||||
"short" |
|
||||
"ubyte" |
|
||||
"ucent" |
|
||||
"uint" |
|
||||
"ulong" |
|
||||
"ushort" |
|
||||
"wchar" { addToken(Token.DATA_TYPE); }
|
||||
|
||||
/* Booleans. */
|
||||
{BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
|
||||
|
||||
/* Standard library (TODO) */
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
{WhiteSpace}+ { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* String/Character literals. */
|
||||
{CharLiteral} { addToken(Token.LITERAL_CHAR); }
|
||||
{UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
|
||||
{ErrorCharLiteral} { addToken(Token.ERROR_CHAR); }
|
||||
{StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
{UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
{ErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
|
||||
{HexStringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
{UnclosedHexStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
{WysiwygStringLiteralStart} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(WYSIWYG_STRING_1); }
|
||||
{WysiwygStringLiteralStart2} { addToken(Token.LITERAL_BACKQUOTE); yybegin(WYSIWYG_STRING_2); }
|
||||
|
||||
/* Comment literals. */
|
||||
"/**/" { addToken(Token.COMMENT_MULTILINE); }
|
||||
{MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
|
||||
{DocCommentBegin} { start = zzMarkedPos-3; yybegin(DOCCOMMENT); }
|
||||
{NestableMLCBegin} { start = zzMarkedPos-2; nestedMlcDepth = 1; yybegin(NESTABLE_MLC); }
|
||||
{LineCommentBegin} { start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
|
||||
{LineDocCommentBegin} { start = zzMarkedPos-3; yybegin(EOL_DOCCOMMENT); }
|
||||
|
||||
/* Annotations. */
|
||||
{Annotation} { addToken(Token.ANNOTATION); }
|
||||
|
||||
/* Separators. */
|
||||
{Separator} { addToken(Token.SEPARATOR); }
|
||||
{Separator2} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
/* Operators. */
|
||||
{Operator} { addToken(Token.OPERATOR); }
|
||||
|
||||
/* Numbers */
|
||||
{IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{BinaryLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
|
||||
{FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
{ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
|
||||
|
||||
{ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters and flag them as identifiers. */
|
||||
. { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
<MLC> {
|
||||
|
||||
[^hwf\n\*]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
|
||||
{MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
|
||||
\* {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
<DOCCOMMENT> {
|
||||
|
||||
[^hwf\n\*]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
|
||||
{MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION); }
|
||||
\* {}
|
||||
\n |
|
||||
<<EOF>> { yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
<NESTABLE_MLC> {
|
||||
|
||||
[^hwf\n\+\/]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
|
||||
{NestableMLCBegin} { nestedMlcDepth++; }
|
||||
"/" {}
|
||||
|
||||
"+/" {
|
||||
System.out.println("... " + nestedMlcDepth);
|
||||
if (--nestedMlcDepth==0) {
|
||||
addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(YYINITIAL);
|
||||
}
|
||||
}
|
||||
\+ {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addNestedMlcEndToken(); return firstToken; }
|
||||
}
|
||||
|
||||
<EOL_COMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
<EOL_DOCCOMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addNullToken(); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
<WYSIWYG_STRING_1> {
|
||||
[^\"]+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
\" { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(YYINITIAL); }
|
||||
<<EOF>> {
|
||||
if (firstToken==null) {
|
||||
addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
}
|
||||
return firstToken;
|
||||
}
|
||||
}
|
||||
|
||||
<WYSIWYG_STRING_2> {
|
||||
[^\`]+ { addToken(Token.LITERAL_BACKQUOTE); }
|
||||
\` { addToken(Token.LITERAL_BACKQUOTE); yybegin(YYINITIAL); }
|
||||
<<EOF>> {
|
||||
if (firstToken==null) {
|
||||
addToken(Token.LITERAL_BACKQUOTE);
|
||||
}
|
||||
return firstToken;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,660 +0,0 @@
|
||||
/*
|
||||
* 09/01/2014
|
||||
*
|
||||
* DartTokenMaker.java - Token parser for Dart.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for Dart files. Its states could be simplified, but are
|
||||
* kept the way they are to keep a degree of similarity (i.e. copy/paste)
|
||||
* between it and HTML/JSP/PHPTokenMaker. This should cause no difference in
|
||||
* performance.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>DartTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 1.0
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class DartTokenMaker
|
||||
%extends AbstractJFlexCTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
/**
|
||||
* Token type specifying we're in a JavaScript multi-line comment.
|
||||
*/
|
||||
private static final int INTERNAL_IN_JS_MLC = -8;
|
||||
|
||||
/**
|
||||
* Token type specifying we're in an invalid multi-line JS string.
|
||||
*/
|
||||
private static final int INTERNAL_IN_JS_STRING_INVALID = -10;
|
||||
|
||||
/**
|
||||
* Token type specifying we're in a valid multi-line JS string.
|
||||
*/
|
||||
private static final int INTERNAL_IN_JS_STRING_VALID = -11;
|
||||
|
||||
/**
|
||||
* Token type specifying we're in an invalid multi-line JS single-quoted string.
|
||||
*/
|
||||
private static final int INTERNAL_IN_JS_CHAR_INVALID = -12;
|
||||
|
||||
/**
|
||||
* Token type specifying we're in a valid multi-line JS single-quoted string.
|
||||
*/
|
||||
private static final int INTERNAL_IN_JS_CHAR_VALID = -13;
|
||||
|
||||
/**
|
||||
* When in the JS_STRING state, whether the current string is valid.
|
||||
*/
|
||||
private boolean validJSString;
|
||||
|
||||
/**
|
||||
* The version of JavaScript being highlighted.
|
||||
*/
|
||||
private static String jsVersion;
|
||||
|
||||
/**
|
||||
* Language state set on JS tokens. Must be 0.
|
||||
*/
|
||||
private static final int LANG_INDEX_DEFAULT = 0;
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public DartTokenMaker() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
static {
|
||||
jsVersion = "1.0";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens as an
|
||||
* "end token;" that is, at <code>zzMarkedPos</code>.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addEndToken(int tokenType) {
|
||||
addToken(zzMarkedPos,zzMarkedPos, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the closest {@link TokenTypes "standard" token type} for a given
|
||||
* "internal" token type (e.g. one whose value is <code>< 0</code>).
|
||||
*/
|
||||
@Override
|
||||
public int getClosestStandardTokenTypeForInternalType(int type) {
|
||||
switch (type) {
|
||||
case INTERNAL_IN_JS_MLC:
|
||||
return TokenTypes.COMMENT_MULTILINE;
|
||||
case INTERNAL_IN_JS_STRING_INVALID:
|
||||
case INTERNAL_IN_JS_STRING_VALID:
|
||||
case INTERNAL_IN_JS_CHAR_INVALID:
|
||||
case INTERNAL_IN_JS_CHAR_VALID:
|
||||
return TokenTypes.LITERAL_STRING_DOUBLE_QUOTE;
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the JavaScript version being highlighted.
|
||||
*
|
||||
* @return Supported JavaScript version.
|
||||
* @see #isJavaScriptCompatible(String)
|
||||
*/
|
||||
public static String getJavaScriptVersion() {
|
||||
return jsVersion;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "//", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
validJSString = true;
|
||||
int languageIndex = LANG_INDEX_DEFAULT;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = YYINITIAL;
|
||||
switch (initialTokenType) {
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = DART_MULTILINE_STRING_DOUBLE;
|
||||
break;
|
||||
case Token.LITERAL_CHAR:
|
||||
state = DART_MULTILINE_STRING_SINGLE;
|
||||
break;
|
||||
case INTERNAL_IN_JS_MLC:
|
||||
state = JS_MLC;
|
||||
break;
|
||||
case INTERNAL_IN_JS_STRING_INVALID:
|
||||
state = JS_STRING;
|
||||
validJSString = false;
|
||||
break;
|
||||
case INTERNAL_IN_JS_STRING_VALID:
|
||||
state = JS_STRING;
|
||||
break;
|
||||
case INTERNAL_IN_JS_CHAR_INVALID:
|
||||
state = JS_CHAR;
|
||||
validJSString = false;
|
||||
break;
|
||||
case INTERNAL_IN_JS_CHAR_VALID:
|
||||
state = JS_CHAR;
|
||||
break;
|
||||
default:
|
||||
state = YYINITIAL; // ???
|
||||
break;
|
||||
}
|
||||
|
||||
setLanguageIndex(languageIndex);
|
||||
start = text.offset;
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns whether features for a specific JS version should be honored
|
||||
* while highlighting.
|
||||
*
|
||||
* @param version JavaScript version required
|
||||
* @return Whether the JavaScript version is the same or greater than
|
||||
* version required.
|
||||
*/
|
||||
public static boolean isJavaScriptCompatible(String version) {
|
||||
return jsVersion.compareTo(version) >= 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the supported JavaScript version because some keywords were
|
||||
* introduced on or after this version.
|
||||
*
|
||||
* @param javaScriptVersion The version of JavaScript to support, such as
|
||||
* "<code>1.5</code>" or "<code>1.6</code>".
|
||||
* @see #isJavaScriptCompatible(String)
|
||||
* @see #getJavaScriptVersion()
|
||||
*/
|
||||
public static void setJavaScriptVersion(String javaScriptVersion) {
|
||||
jsVersion = javaScriptVersion;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Whitespace = ([ \t\f]+)
|
||||
LineTerminator = ([\n])
|
||||
|
||||
Letter = [A-Za-z]
|
||||
NonzeroDigit = [1-9]
|
||||
Digit = ("0"|{NonzeroDigit})
|
||||
HexDigit = ({Digit}|[A-Fa-f])
|
||||
OctalDigit = ([0-7])
|
||||
LetterOrDigit = ({Letter}|{Digit})
|
||||
EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
|
||||
NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
|
||||
IdentifierStart = ({Letter}|"_"|"$")
|
||||
IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
|
||||
JS_MLCBegin = "/*"
|
||||
JS_MLCEnd = "*/"
|
||||
JS_LineCommentBegin = "//"
|
||||
JS_IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
|
||||
JS_IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
|
||||
JS_IntegerLiteral = ({JS_IntegerHelper1}[lL]?)
|
||||
JS_HexLiteral = ({JS_IntegerHelper2}[lL]?)
|
||||
JS_FloatHelper1 = ([fFdD]?)
|
||||
JS_FloatHelper2 = ([eE][+-]?{Digit}+{JS_FloatHelper1})
|
||||
JS_FloatLiteral1 = ({Digit}+"."({JS_FloatHelper1}|{JS_FloatHelper2}|{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2})))
|
||||
JS_FloatLiteral2 = ("."{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2}))
|
||||
JS_FloatLiteral3 = ({Digit}+{JS_FloatHelper2})
|
||||
JS_FloatLiteral = ({JS_FloatLiteral1}|{JS_FloatLiteral2}|{JS_FloatLiteral3}|({Digit}+[fFdD]))
|
||||
JS_ErrorNumberFormat = (({JS_IntegerLiteral}|{JS_HexLiteral}|{JS_FloatLiteral}){NonSeparator}+)
|
||||
JS_Separator = ([\(\)\{\}\[\]\]])
|
||||
JS_Separator2 = ([\;,.])
|
||||
JS_NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"||"|"&&"|">>>")
|
||||
JS_AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
|
||||
JS_Operator = ({JS_NonAssignmentOperator}|{JS_AssignmentOperator})
|
||||
JS_Identifier = ({IdentifierStart}{IdentifierPart}*)
|
||||
JS_ErrorIdentifier = ({NonSeparator}+)
|
||||
|
||||
DART_Annotation = ("@"{Letter}{LetterOrDigit}*)
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ({LetterOrDigit}|"_"|[\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$]|{LetterOrDigit})
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
|
||||
%state JS_STRING
|
||||
%state JS_CHAR
|
||||
%state JS_MLC
|
||||
%state JS_EOL_COMMENT
|
||||
%state DART_MULTILINE_STRING_DOUBLE
|
||||
%state DART_MULTILINE_STRING_SINGLE
|
||||
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
// Keywords
|
||||
"abstract" |
|
||||
"assert" |
|
||||
"class" |
|
||||
"const" |
|
||||
"extends" |
|
||||
"factory" |
|
||||
"get" |
|
||||
"implements" |
|
||||
"import" |
|
||||
"interface" |
|
||||
"library" |
|
||||
"negate" |
|
||||
"new" |
|
||||
"null" |
|
||||
"operator" |
|
||||
"set" |
|
||||
"source" |
|
||||
"static" |
|
||||
"super" |
|
||||
"this" |
|
||||
"typedef" |
|
||||
"var" |
|
||||
"final" |
|
||||
"if" |
|
||||
"else" |
|
||||
"for" |
|
||||
"in" |
|
||||
"is" |
|
||||
"while" |
|
||||
"do" |
|
||||
"switch" |
|
||||
"case" |
|
||||
"default" |
|
||||
"in" |
|
||||
"try" |
|
||||
"catch" |
|
||||
"finally" |
|
||||
"break" |
|
||||
"continue" |
|
||||
"throw" |
|
||||
"assert" { addToken(Token.RESERVED_WORD); }
|
||||
"return" { addToken(Token.RESERVED_WORD_2); }
|
||||
|
||||
// Literals.
|
||||
"false" |
|
||||
"true" { addToken(Token.LITERAL_BOOLEAN); }
|
||||
"NaN" { addToken(Token.RESERVED_WORD); }
|
||||
"Infinity" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
// Data types
|
||||
"bool" |
|
||||
"int" |
|
||||
"double" |
|
||||
"num" |
|
||||
"void" { addToken(Token.DATA_TYPE); }
|
||||
|
||||
// stdlib types
|
||||
"AssertionError" |
|
||||
"Clock" |
|
||||
"Collection" |
|
||||
"Comparable" |
|
||||
"Date" |
|
||||
"Dispatcher" |
|
||||
"Duration" |
|
||||
"Expect" |
|
||||
"FallThroughError" |
|
||||
"Function" |
|
||||
"HashMap" |
|
||||
"HashSet" |
|
||||
"Hashable" |
|
||||
"Isolate" |
|
||||
"Iterable" |
|
||||
"Iterator" |
|
||||
"LinkedHashMap" |
|
||||
"List" |
|
||||
"Map" |
|
||||
"Match" |
|
||||
"Math" |
|
||||
"Object" |
|
||||
"Pattern" |
|
||||
"Promise" |
|
||||
"Proxy" |
|
||||
"Queue" |
|
||||
"ReceivePort" |
|
||||
"RegExp" |
|
||||
"SendPort" |
|
||||
"Set" |
|
||||
"StopWatch" |
|
||||
"String" |
|
||||
"StringBuffer" |
|
||||
"Strings" |
|
||||
"TimeZone" |
|
||||
"TypeError" |
|
||||
|
||||
// stdlib exceptions
|
||||
"BadNumberFormatException" |
|
||||
"ClosureArgumentMismatchException" |
|
||||
"EmptyQueueException" |
|
||||
"Exception" |
|
||||
"ExpectException" |
|
||||
"IllegalAccessException" |
|
||||
"IllegalArgumentException" |
|
||||
"IllegalJSRegExpException" |
|
||||
"IndexOutOfRangeException" |
|
||||
"IntegerDivisionByZeroException" |
|
||||
"NoMoreElementsException" |
|
||||
"NoSuchMethodException" |
|
||||
"NotImplementedException" |
|
||||
"NullPointerException" |
|
||||
"ObjectNotClosureException" |
|
||||
"OutOfMemoryException" |
|
||||
"StackOverflowException" |
|
||||
"UnsupportedOperationException" |
|
||||
"WrongArgumentCountException" { addToken(Token.FUNCTION); }
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
{JS_Identifier} { addToken(Token.IDENTIFIER); }
|
||||
{Whitespace} { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* Multi-line string literals. */
|
||||
\"\"\" { start = zzMarkedPos-3; yybegin(DART_MULTILINE_STRING_DOUBLE); }
|
||||
\'\'\' { start = zzMarkedPos-3; yybegin(DART_MULTILINE_STRING_SINGLE); }
|
||||
|
||||
/* String/Character literals. */
|
||||
[\'] { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR); }
|
||||
[\"] { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING); }
|
||||
|
||||
{DART_Annotation} { addToken(Token.ANNOTATION); }
|
||||
/* Comment literals. */
|
||||
"/**/" { addToken(Token.COMMENT_MULTILINE); }
|
||||
{JS_MLCBegin} { start = zzMarkedPos-2; yybegin(JS_MLC); }
|
||||
{JS_LineCommentBegin} { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT); }
|
||||
|
||||
/* Deprecated stuff */
|
||||
"#library" |
|
||||
"#import" |
|
||||
"#source" |
|
||||
"#resource" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
/* Separators. */
|
||||
{JS_Separator} { addToken(Token.SEPARATOR); }
|
||||
{JS_Separator2} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
/* Operators. */
|
||||
{JS_Operator} { addToken(Token.OPERATOR); }
|
||||
|
||||
/* Numbers */
|
||||
{JS_IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{JS_HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
|
||||
{JS_FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
{JS_ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
|
||||
|
||||
{JS_ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters and flag them as bad. */
|
||||
. { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
<DART_MULTILINE_STRING_DOUBLE> {
|
||||
[^\"\\\n]* {}
|
||||
\\.? { /* Skip escaped chars, handles case: '\"""'. */ }
|
||||
\"\"\" { addToken(start,zzStartRead+2, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(YYINITIAL); }
|
||||
\" {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<DART_MULTILINE_STRING_SINGLE> {
|
||||
[^\'\\\n]* {}
|
||||
\\.? { /* Skip escaped chars, handles case: "\'''". */ }
|
||||
\'\'\' { addToken(start,zzStartRead+2, Token.LITERAL_CHAR); yybegin(YYINITIAL); }
|
||||
\' {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
|
||||
}
|
||||
|
||||
<JS_STRING> {
|
||||
[^\n\\\"]+ {}
|
||||
\\x{HexDigit}{2} {}
|
||||
\\x { /* Invalid latin-1 character \xXX */ validJSString = false; }
|
||||
\\u{HexDigit}{4} {}
|
||||
\\u { /* Invalid Unicode character \\uXXXX */ validJSString = false; }
|
||||
\\. { /* Skip all escaped chars. */ }
|
||||
\\ { /* Line ending in '\' => continue to next line. */
|
||||
if (validJSString) {
|
||||
addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
addEndToken(INTERNAL_IN_JS_STRING_VALID);
|
||||
}
|
||||
else {
|
||||
addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
|
||||
addEndToken(INTERNAL_IN_JS_STRING_INVALID);
|
||||
}
|
||||
return firstToken;
|
||||
}
|
||||
\" { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(YYINITIAL); }
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
}
|
||||
|
||||
<JS_CHAR> {
|
||||
[^\n\\\']+ {}
|
||||
\\x{HexDigit}{2} {}
|
||||
\\x { /* Invalid latin-1 character \xXX */ validJSString = false; }
|
||||
\\u{HexDigit}{4} {}
|
||||
\\u { /* Invalid Unicode character \\uXXXX */ validJSString = false; }
|
||||
\\. { /* Skip all escaped chars. */ }
|
||||
\\ { /* Line ending in '\' => continue to next line. */
|
||||
if (validJSString) {
|
||||
addToken(start,zzStartRead, Token.LITERAL_CHAR);
|
||||
addEndToken(INTERNAL_IN_JS_CHAR_VALID);
|
||||
}
|
||||
else {
|
||||
addToken(start,zzStartRead, Token.ERROR_CHAR);
|
||||
addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
|
||||
}
|
||||
return firstToken;
|
||||
}
|
||||
\' { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(YYINITIAL); }
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addNullToken(); return firstToken; }
|
||||
}
|
||||
|
||||
<JS_MLC> {
|
||||
// JavaScript MLC's. This state is essentially Java's MLC state.
|
||||
[^hwf\n\*]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
{JS_MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
|
||||
\* {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
|
||||
}
|
||||
|
||||
<JS_EOL_COMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,559 +0,0 @@
|
||||
/*
|
||||
* 7/28/2009
|
||||
*
|
||||
* DelphiTokenMaker.java - Scanner for the Delphi programming language.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for the Delphi programming language.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>DelphiTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class DelphiTokenMaker
|
||||
%extends AbstractJFlexTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Token type specific to DelphiTokenMaker; denotes a line ending
|
||||
* with an unterminated "(*" comment.
|
||||
*/
|
||||
public static final int INTERNAL_MLC2 = -1;
|
||||
|
||||
/**
|
||||
* Token type specific to DelphiTokenMaker; denotes a line ending
|
||||
* with an unterminated "{$" compiler directive.
|
||||
*/
|
||||
public static final int INTERNAL_COMPILER_DIRECTIVE = -2;
|
||||
|
||||
/**
|
||||
* Token type specific to DelphiTokenMaker; denotes a line ending
|
||||
* with an unterminated "(*$" compiler directive.
|
||||
*/
|
||||
public static final int INTERNAL_COMPILER_DIRECTIVE2 = -3;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public DelphiTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens as an
|
||||
* "end token;" that is, at <code>zzMarkedPos</code>.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addEndToken(int tokenType) {
|
||||
addToken(zzMarkedPos,zzMarkedPos, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addHyperlinkToken(int, int, int)
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
* @param hyperlink Whether this token is a hyperlink.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType,
|
||||
int startOffset, boolean hyperlink) {
|
||||
super.addToken(array, start,end, tokenType, startOffset, hyperlink);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "//", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.COMMENT_MULTILINE:
|
||||
state = MLC;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_MLC2:
|
||||
state = MLC2;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_COMPILER_DIRECTIVE:
|
||||
state = COMPILER_DIRECTIVE;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_COMPILER_DIRECTIVE2:
|
||||
state = COMPILER_DIRECTIVE2;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Letter = [A-Za-z]
|
||||
LetterOrUnderscore = ({Letter}|"_")
|
||||
NonzeroDigit = [1-9]
|
||||
Digit = ("0"|{NonzeroDigit})
|
||||
HexDigit = ({Digit}|[A-Fa-f])
|
||||
OctalDigit = ([0-7])
|
||||
NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
|
||||
IdentifierStart = ({LetterOrUnderscore}|"$")
|
||||
IdentifierPart = ({IdentifierStart}|{Digit})
|
||||
|
||||
LineTerminator = (\n)
|
||||
WhiteSpace = ([ \t\f])
|
||||
|
||||
UnclosedStringLiteral = ([\'][^\']*)
|
||||
StringLiteral = ({UnclosedStringLiteral}[\'])
|
||||
EscapeSequence = ("#"{Digit}*)
|
||||
|
||||
MLCBegin = "{"
|
||||
MLCEnd = "}"
|
||||
MLC2Begin = "(*"
|
||||
MLC2End = "*)"
|
||||
CompilerDirective1Begin = ({MLCBegin}"$")
|
||||
CompilerDirective2Begin = ({MLC2Begin}"$")
|
||||
LineCommentBegin = "//"
|
||||
|
||||
IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
|
||||
IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
|
||||
IntegerLiteral = ({IntegerHelper1}[lL]?)
|
||||
HexLiteral = ({IntegerHelper2}[lL]?)
|
||||
FloatHelper1 = ([fFdD]?)
|
||||
FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
|
||||
FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
|
||||
FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
|
||||
FloatLiteral3 = ({Digit}+{FloatHelper2})
|
||||
FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
|
||||
ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
|
||||
BooleanLiteral = ("true"|"false")
|
||||
|
||||
Separator = ([\(\)\[\]])
|
||||
Separator2 = ([\;,.])
|
||||
|
||||
Operator = ([\^\@\:\=\<\>\+\-\/\*])
|
||||
|
||||
Identifier = ({IdentifierStart}{IdentifierPart}*)
|
||||
ErrorIdentifier = ({NonSeparator}+)
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$]|{Letter}|{Digit})
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
|
||||
%state MLC
|
||||
%state MLC2
|
||||
%state COMPILER_DIRECTIVE
|
||||
%state COMPILER_DIRECTIVE2
|
||||
%state EOL_COMMENT
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
/* Keywords */
|
||||
"array" |
|
||||
"as" |
|
||||
"at" |
|
||||
"asm" |
|
||||
"begin" |
|
||||
"case" |
|
||||
"class" |
|
||||
"const" |
|
||||
"constructor" |
|
||||
"destructor" |
|
||||
"dispinterface" |
|
||||
"div" |
|
||||
"do" |
|
||||
"downto" |
|
||||
"else" |
|
||||
"end" |
|
||||
"except" |
|
||||
"exports" |
|
||||
"file" |
|
||||
"final" |
|
||||
"finalization" |
|
||||
"finally" |
|
||||
"for" |
|
||||
"function" |
|
||||
"goto" |
|
||||
"if" |
|
||||
"implementation" |
|
||||
"in" |
|
||||
"inherited" |
|
||||
"initialization" |
|
||||
"inline" |
|
||||
"interface" |
|
||||
"is" |
|
||||
"label" |
|
||||
"mod" |
|
||||
"not" |
|
||||
"object" |
|
||||
"of" |
|
||||
"on" |
|
||||
"or" |
|
||||
"out" |
|
||||
"packed" |
|
||||
"procedure" |
|
||||
"program" |
|
||||
"property" |
|
||||
"raise" |
|
||||
"record" |
|
||||
"repeat" |
|
||||
"resourcestring" |
|
||||
"set" |
|
||||
"sealed" |
|
||||
"shl" |
|
||||
"shr" |
|
||||
"static" |
|
||||
"string" |
|
||||
"then" |
|
||||
"threadvar" |
|
||||
"to" |
|
||||
"try" |
|
||||
"type" |
|
||||
"unit" |
|
||||
"unsafe" |
|
||||
"until" |
|
||||
"uses" |
|
||||
"var" |
|
||||
"while" |
|
||||
"with" |
|
||||
"xor" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
/* Directives. */
|
||||
"absolute" |
|
||||
"abstract" |
|
||||
"assembler" |
|
||||
"automated" |
|
||||
"cdecl" |
|
||||
"contains" |
|
||||
"default" |
|
||||
"deprecated" |
|
||||
"dispid" |
|
||||
"dynamic" |
|
||||
"export" |
|
||||
"external" |
|
||||
"far" |
|
||||
"forward" |
|
||||
"implements" |
|
||||
"index" |
|
||||
"library" |
|
||||
"local" |
|
||||
"message" |
|
||||
"name" |
|
||||
"namespaces" |
|
||||
"near" |
|
||||
"nil" |
|
||||
"nodefault" |
|
||||
"overload" |
|
||||
"override" |
|
||||
"package" |
|
||||
"pascal" |
|
||||
"platform" |
|
||||
"private" |
|
||||
"protected" |
|
||||
"public" |
|
||||
"published" |
|
||||
"read" |
|
||||
"readonly" |
|
||||
"register" |
|
||||
"reintroduce" |
|
||||
"requires" |
|
||||
"resident" |
|
||||
"safecall" |
|
||||
"self" |
|
||||
"stdcall" |
|
||||
"stored" |
|
||||
"varargs" |
|
||||
"virtual" |
|
||||
"write" |
|
||||
"writeonly" { addToken(Token.FUNCTION); }
|
||||
|
||||
/* Data types. */
|
||||
"shortint" |
|
||||
"byte" |
|
||||
"char" |
|
||||
"smallint" |
|
||||
"integer" |
|
||||
"word" |
|
||||
"longint" |
|
||||
"cardinal" |
|
||||
"boolean" |
|
||||
"bytebool" |
|
||||
"wordbool" |
|
||||
"longbool" |
|
||||
"real" |
|
||||
"single" |
|
||||
"double" |
|
||||
"extended" |
|
||||
"comp" |
|
||||
"currency" |
|
||||
"pointer" { addToken(Token.DATA_TYPE); }
|
||||
|
||||
{BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
{WhiteSpace}+ { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* String/Character literals. */
|
||||
{StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
{UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
{EscapeSequence} { addToken(Token.PREPROCESSOR); }
|
||||
|
||||
/* Comment literals. */
|
||||
{CompilerDirective1Begin} {start = zzMarkedPos-2; yybegin(COMPILER_DIRECTIVE); }
|
||||
{CompilerDirective2Begin} {start = zzMarkedPos-3; yybegin(COMPILER_DIRECTIVE2); }
|
||||
{MLCBegin} { start = zzMarkedPos-1; yybegin(MLC); }
|
||||
{MLC2Begin} { start = zzMarkedPos-2; yybegin(MLC2); }
|
||||
{LineCommentBegin} { start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
|
||||
|
||||
{Separator} { addToken(Token.SEPARATOR); }
|
||||
{Separator2} { addToken(Token.IDENTIFIER); }
|
||||
{Operator} { addToken(Token.OPERATOR); }
|
||||
|
||||
{IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
|
||||
{FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
{ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
|
||||
|
||||
{ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters. */
|
||||
. { addToken(Token.IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<MLC> {
|
||||
|
||||
[^hwf\n\}]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
{MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.COMMENT_MULTILINE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<MLC2> {
|
||||
|
||||
[^hwf\n\*]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_MLC2); return firstToken; }
|
||||
{MLC2End} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
|
||||
\* {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_MLC2); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<COMPILER_DIRECTIVE> {
|
||||
[^\n\}]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE); return firstToken; }
|
||||
{MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.PREPROCESSOR); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<COMPILER_DIRECTIVE2> {
|
||||
[^\n\*]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE2); return firstToken; }
|
||||
{MLC2End} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.PREPROCESSOR); }
|
||||
\* {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE2); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
<EOL_COMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,282 +0,0 @@
|
||||
/*
|
||||
* 11/24/2015
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for Dockerfiles.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>DockerTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class DockerTokenMaker
|
||||
%extends AbstractJFlexTokenMaker
|
||||
%unicode
|
||||
%ignorecase
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public DockerTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "#", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns whether tokens of the specified type should have "mark
|
||||
* occurrences" enabled for the current programming language.
|
||||
*
|
||||
* @param type The token type.
|
||||
* @return Whether tokens of this type should have "mark occurrences"
|
||||
* enabled.
|
||||
*/
|
||||
@Override
|
||||
public boolean getMarkOccurrencesOfTokenType(int type) {
|
||||
return type==Token.IDENTIFIER || type==Token.RESERVED_WORD;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = TokenTypes.NULL;
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Letter = [A-Za-z]
|
||||
Digit = [0-9]
|
||||
IdentifierPart = ({Letter}|{Digit}|[_\-\.])
|
||||
Identifier = ({IdentifierPart}|{IdentifierPart}*)
|
||||
WhiteSpace = ([ \t\f])
|
||||
|
||||
%state STRING
|
||||
%state CHAR_LITERAL
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
/* Keywords */
|
||||
"maintainer" |
|
||||
"from" |
|
||||
"onbuild" |
|
||||
"run" |
|
||||
"expose" |
|
||||
"env" |
|
||||
"add" |
|
||||
"copy" |
|
||||
"volume" |
|
||||
"user" |
|
||||
"workdir" |
|
||||
"cmd" |
|
||||
"entrypoint" |
|
||||
"label" |
|
||||
"arg" |
|
||||
"stopsignal" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
{WhiteSpace}+ { addToken(Token.WHITESPACE); }
|
||||
|
||||
"[" |
|
||||
"]" { addToken(Token.SEPARATOR); }
|
||||
|
||||
"|" |
|
||||
">" |
|
||||
">>" { addToken(Token.OPERATOR); }
|
||||
|
||||
/* String/Character literals. */
|
||||
\" { start = zzMarkedPos-1; yybegin(STRING); }
|
||||
\' { start = zzMarkedPos-1; yybegin(CHAR_LITERAL); }
|
||||
|
||||
/* Comment literals. */
|
||||
"#".* { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
"\n" |
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters. */
|
||||
. { addToken(Token.IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
<STRING> {
|
||||
[^\n\\\"]+ {}
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
\" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
}
|
||||
|
||||
<CHAR_LITERAL> {
|
||||
[^\n\\\']+ {}
|
||||
\\.? { /* Skip escaped single quotes only, but this should still work. */ }
|
||||
\' { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
|
||||
}
|
||||
@@ -1,696 +0,0 @@
|
||||
/* The following code was generated by JFlex 1.4.1 on 11/25/15 12:02 AM */
|
||||
/*
|
||||
* 11/24/2015
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
|
||||
import org.fife.ui.rsyntaxtextarea.Token;
|
||||
import org.fife.ui.rsyntaxtextarea.TokenImpl;
|
||||
import org.fife.ui.rsyntaxtextarea.TokenTypes;
|
||||
|
||||
/**
|
||||
* Scanner for Dockerfiles.
|
||||
* <p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost completely
|
||||
* removed to be competitive with the handwritten lexers (subclasses of
|
||||
* <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around). We can
|
||||
* achieve this because RText always scans exactly 1 line of tokens at a time,
|
||||
* and hands the scanner this line as an array of characters (a Segment really).
|
||||
* Since tokens contain pointers to char arrays instead of Strings holding their
|
||||
* contents, there is no need for allocating new memory for Strings.
|
||||
* <p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.
|
||||
* <p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>DockerTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>. You
|
||||
* should hand-delete the second of each definition (the ones generated by the
|
||||
* lexer), as these generated methods modify the input buffer, which we'll never
|
||||
* have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT be
|
||||
* initialized. This is a needless memory allocation for us since we will be
|
||||
* pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would with
|
||||
* any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
public class DockerTokenMaker extends AbstractJFlexTokenMaker {
|
||||
|
||||
/** This character denotes the end of file */
|
||||
public static final int YYEOF = -1;
|
||||
/** lexical states */
|
||||
public static final int STRING = 1;
|
||||
public static final int CHAR_LITERAL = 2;
|
||||
public static final int YYINITIAL = 0;
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final String ZZ_CMAP_PACKED = "\11\0\1\2\1\37\1\0\1\2\23\0\1\2\1\0\1\34\1\36"
|
||||
+ "\3\0\1\35\5\0\2\1\1\0\12\1\4\0\1\33\2\0\1\4" + "\1\14\1\24\1\17\1\10\1\12\1\30\1\1\1\5\1\1\1\27"
|
||||
+ "\1\16\1\3\1\6\1\13\1\21\1\1\1\11\1\22\1\7\1\15" + "\1\23\1\26\1\20\1\25\1\1\1\31\1\40\1\31\1\0\1\1"
|
||||
+ "\1\0\1\4\1\14\1\24\1\17\1\10\1\12\1\30\1\1\1\5" + "\1\1\1\27\1\16\1\3\1\6\1\13\1\21\1\1\1\11\1\22"
|
||||
+ "\1\7\1\15\1\23\1\26\1\20\1\25\1\1\1\0\1\32\uff83\0";
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
|
||||
/**
|
||||
* Translates DFA states to action switch labels.
|
||||
*/
|
||||
private static final int[] ZZ_ACTION = zzUnpackAction();
|
||||
private static final String ZZ_ACTION_PACKED_0 = "\1\1\2\0\2\1\1\2\14\1\1\3\2\4\1\5"
|
||||
+ "\1\6\1\7\1\10\1\11\1\12\1\13\1\14\1\11" + "\1\15\1\16\1\17\16\1\1\14\1\17\1\1\1\20" + "\41\1";
|
||||
|
||||
private static int[] zzUnpackAction() {
|
||||
int[] result = new int[84];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAction(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a state to a row index in the transition table
|
||||
*/
|
||||
private static final int[] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\41\0\102\0\143\0\204\0\245\0\306\0\347"
|
||||
+ "\0\u0108\0\u0129\0\u014a\0\u016b\0\u018c\0\u01ad\0\u01ce\0\u01ef"
|
||||
+ "\0\u0210\0\u0231\0\143\0\143\0\u0252\0\143\0\143\0\u0273"
|
||||
+ "\0\143\0\u0294\0\143\0\143\0\u02b5\0\u02d6\0\143\0\143"
|
||||
+ "\0\u02f7\0\u0318\0\u0339\0\u035a\0\u037b\0\u039c\0\u03bd\0\u03de"
|
||||
+ "\0\u03ff\0\u0420\0\u0441\0\u0462\0\u0483\0\u04a4\0\u04c5\0\143"
|
||||
+ "\0\143\0\u04e6\0\204\0\u0507\0\u0528\0\u0549\0\u056a\0\u058b"
|
||||
+ "\0\u05ac\0\u05cd\0\u05ee\0\u060f\0\u0630\0\u0651\0\u0672\0\u0693"
|
||||
+ "\0\u06b4\0\u06d5\0\u06f6\0\u0717\0\u0738\0\u0759\0\u077a\0\u079b"
|
||||
+ "\0\u07bc\0\u07dd\0\u07fe\0\u081f\0\u0840\0\u0861\0\u0882\0\u08a3" + "\0\u08c4\0\u08e5\0\u0906\0\u0927";
|
||||
|
||||
private static int[] zzUnpackRowMap() {
|
||||
int[] result = new int[84];
|
||||
int offset = 0;
|
||||
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackRowMap(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int high = packed.charAt(i++) << 16;
|
||||
result[j++] = high | packed.charAt(i++);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* The transition table of the DFA
|
||||
*/
|
||||
private static final int[] ZZ_TRANS = zzUnpackTrans();
|
||||
private static final String ZZ_TRANS_PACKED_0 = "\1\4\1\5\1\6\1\7\1\10\3\5\1\11\1\12"
|
||||
+ "\1\13\1\14\1\5\1\15\1\16\3\5\1\17\1\20" + "\1\21\1\5\1\22\2\5\1\23\1\24\1\25\1\26"
|
||||
+ "\1\27\1\30\1\31\1\4\34\32\1\33\2\32\1\34" + "\1\35\35\36\1\37\1\36\1\40\1\41\42\0\1\5"
|
||||
+ "\1\0\26\5\12\0\1\6\37\0\1\5\1\0\1\5" + "\1\42\24\5\11\0\1\5\1\0\6\5\1\43\5\5"
|
||||
+ "\1\44\11\5\11\0\1\5\1\0\3\5\1\45\11\5" + "\1\46\10\5\11\0\1\5\1\0\12\5\1\47\13\5"
|
||||
+ "\11\0\1\5\1\0\6\5\1\50\17\5\11\0\1\5" + "\1\0\3\5\1\51\22\5\11\0\1\5\1\0\17\5"
|
||||
+ "\1\52\6\5\11\0\1\5\1\0\1\5\1\53\24\5" + "\11\0\1\5\1\0\4\5\1\54\21\5\11\0\1\5"
|
||||
+ "\1\0\10\5\1\55\15\5\11\0\1\5\1\0\1\44" + "\7\5\1\56\15\5\11\0\1\5\1\0\10\5\1\57"
|
||||
+ "\15\5\43\0\1\24\5\0\37\30\1\0\1\30\34\32" + "\1\0\2\32\2\0\37\60\1\0\1\60\35\36\1\0"
|
||||
+ "\1\36\2\0\37\61\1\0\1\61\1\0\1\5\1\0" + "\2\5\1\62\23\5\11\0\1\5\1\0\25\5\1\63"
|
||||
+ "\11\0\1\5\1\0\14\5\1\63\11\5\11\0\1\5" + "\1\0\4\5\1\64\13\5\1\63\5\5\11\0\1\5"
|
||||
+ "\1\0\16\5\1\65\7\5\11\0\1\5\1\0\3\5" + "\1\63\22\5\11\0\1\5\1\0\10\5\1\66\15\5"
|
||||
+ "\11\0\1\5\1\0\11\5\1\67\14\5\11\0\1\5" + "\1\0\5\5\1\70\20\5\11\0\1\5\1\0\11\5"
|
||||
+ "\1\71\14\5\11\0\1\5\1\0\10\5\1\72\15\5" + "\11\0\1\5\1\0\13\5\1\73\12\5\11\0\1\5"
|
||||
+ "\1\0\16\5\1\74\7\5\11\0\1\5\1\0\6\5" + "\1\75\17\5\11\0\1\5\1\0\3\5\1\76\22\5"
|
||||
+ "\11\0\1\5\1\0\6\5\1\77\17\5\11\0\1\5" + "\1\0\10\5\1\100\15\5\11\0\1\5\1\0\1\63"
|
||||
+ "\25\5\11\0\1\5\1\0\12\5\1\101\13\5\11\0" + "\1\5\1\0\6\5\1\63\17\5\11\0\1\5\1\0"
|
||||
+ "\5\5\1\102\20\5\11\0\1\5\1\0\16\5\1\103" + "\7\5\11\0\1\5\1\0\12\5\1\104\13\5\11\0"
|
||||
+ "\1\5\1\0\22\5\1\63\3\5\11\0\1\5\1\0" + "\24\5\1\105\1\5\11\0\1\5\1\0\4\5\1\106"
|
||||
+ "\21\5\11\0\1\5\1\0\22\5\1\107\3\5\11\0" + "\1\5\1\0\17\5\1\110\6\5\11\0\1\5\1\0"
|
||||
+ "\2\5\1\111\23\5\11\0\1\5\1\0\13\5\1\63" + "\12\5\11\0\1\5\1\0\17\5\1\112\6\5\11\0"
|
||||
+ "\1\5\1\0\1\110\25\5\11\0\1\5\1\0\14\5" + "\1\113\11\5\11\0\1\5\1\0\1\5\1\114\24\5"
|
||||
+ "\11\0\1\5\1\0\16\5\1\115\7\5\11\0\1\5" + "\1\0\5\5\1\63\20\5\11\0\1\5\1\0\13\5"
|
||||
+ "\1\44\12\5\11\0\1\5\1\0\2\5\1\116\23\5" + "\11\0\1\5\1\0\2\5\1\70\23\5\11\0\1\5"
|
||||
+ "\1\0\2\5\1\117\23\5\11\0\1\5\1\0\10\5" + "\1\120\15\5\11\0\1\5\1\0\25\5\1\121\11\0"
|
||||
+ "\1\5\1\0\3\5\1\52\22\5\11\0\1\5\1\0" + "\2\5\1\122\23\5\11\0\1\5\1\0\3\5\1\123"
|
||||
+ "\22\5\11\0\1\5\1\0\3\5\1\124\22\5\11\0" + "\1\5\1\0\1\5\1\102\24\5\11\0\1\5\1\0" + "\4\5\1\63\21\5\10\0";
|
||||
|
||||
private static int[] zzUnpackTrans() {
|
||||
int[] result = new int[2376];
|
||||
int offset = 0;
|
||||
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackTrans(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
value--;
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/* error codes */
|
||||
private static final int ZZ_UNKNOWN_ERROR = 0;
|
||||
private static final int ZZ_NO_MATCH = 1;
|
||||
private static final int ZZ_PUSHBACK_2BIG = 2;
|
||||
/* error messages for the codes above */
|
||||
private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input",
|
||||
"Error: pushback value was too large" };
|
||||
/**
|
||||
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
|
||||
*/
|
||||
private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 = "\1\1\2\0\1\11\16\1\2\11\1\1\2\11\1\1"
|
||||
+ "\1\11\1\1\2\11\2\1\2\11\17\1\2\11\43\1";
|
||||
|
||||
private static int[] zzUnpackAttribute() {
|
||||
int[] result = new int[84];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAttribute(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/** the input device */
|
||||
private java.io.Reader zzReader;
|
||||
/** the current state of the DFA */
|
||||
private int zzState;
|
||||
/** the current lexical state */
|
||||
private int zzLexicalState = YYINITIAL;
|
||||
/**
|
||||
* this buffer contains the current text to be matched and is the source of the
|
||||
* yytext() string
|
||||
*/
|
||||
private char zzBuffer[];
|
||||
/** the textposition at the last accepting state */
|
||||
private int zzMarkedPos;
|
||||
/** the current text position in the buffer */
|
||||
private int zzCurrentPos;
|
||||
/** startRead marks the beginning of the yytext() string in the buffer */
|
||||
private int zzStartRead;
|
||||
/**
|
||||
* endRead marks the last character in the buffer, that has been read from input
|
||||
*/
|
||||
private int zzEndRead;
|
||||
/** zzAtEOF == true <=> the scanner is at the EOF */
|
||||
private boolean zzAtEOF;
|
||||
/* user code: */
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a no-parameter
|
||||
* constructor.
|
||||
*/
|
||||
public DockerTokenMaker() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos - 1, tokenType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start, end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "#", null };
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether tokens of the specified type should have "mark occurrences"
|
||||
* enabled for the current programming language.
|
||||
*
|
||||
* @param type The token type.
|
||||
* @return Whether tokens of this type should have "mark occurrences" enabled.
|
||||
*/
|
||||
@Override
|
||||
public boolean getMarkOccurrencesOfTokenType(int type) {
|
||||
return type == Token.IDENTIFIER || type == Token.RESERVED_WORD;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated from
|
||||
* <code>text</code>. This method must be implemented by subclasses so they can
|
||||
* correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing the syntax
|
||||
* highlighted text.
|
||||
*/
|
||||
@Override
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
// Start off in the proper state.
|
||||
int state = TokenTypes.NULL;
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos >= s.offset + s.count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream. Does not close the old
|
||||
* reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream <b>cannot</b> be
|
||||
* reused (internal buffer is discarded and lost). Lexical state is set to
|
||||
* <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill no longer
|
||||
* "refills" the buffer (since the way we do it, it's always "full" the first
|
||||
* time through, since it points to the segment's array). So, we assign
|
||||
* zzEndRead here.
|
||||
*/
|
||||
// zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner There is also a java.io.InputStream version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
public DockerTokenMaker(java.io.Reader in) {
|
||||
this.zzReader = in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner. There is also java.io.Reader version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Inputstream to read input from.
|
||||
*/
|
||||
public DockerTokenMaker(java.io.InputStream in) {
|
||||
this(new java.io.InputStreamReader(in));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unpacks the compressed character translation table.
|
||||
*
|
||||
* @param packed the packed character translation table
|
||||
* @return the unpacked character translation table
|
||||
*/
|
||||
private static char[] zzUnpackCMap(String packed) {
|
||||
char[] map = new char[0x10000];
|
||||
int i = 0; /* index in packed string */
|
||||
int j = 0; /* index in unpacked array */
|
||||
while (i < 160) {
|
||||
int count = packed.charAt(i++);
|
||||
char value = packed.charAt(i++);
|
||||
do
|
||||
map[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the input stream.
|
||||
*/
|
||||
public final void yyclose() throws java.io.IOException {
|
||||
zzAtEOF = true; /* indicate end of file */
|
||||
zzEndRead = zzStartRead; /* invalidate buffer */
|
||||
if (zzReader != null)
|
||||
zzReader.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current lexical state.
|
||||
*/
|
||||
public final int yystate() {
|
||||
return zzLexicalState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enters a new lexical state
|
||||
*
|
||||
* @param newState the new lexical state
|
||||
*/
|
||||
@Override
|
||||
public final void yybegin(int newState) {
|
||||
zzLexicalState = newState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the text matched by the current regular expression.
|
||||
*/
|
||||
public final String yytext() {
|
||||
return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character at position <tt>pos</tt> from the matched text.
|
||||
*
|
||||
* It is equivalent to yytext().charAt(pos), but faster
|
||||
*
|
||||
* @param pos the position of the character to fetch. A value from 0 to
|
||||
* yylength()-1.
|
||||
*
|
||||
* @return the character at position pos
|
||||
*/
|
||||
public final char yycharat(int pos) {
|
||||
return zzBuffer[zzStartRead + pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the length of the matched text region.
|
||||
*/
|
||||
public final int yylength() {
|
||||
return zzMarkedPos - zzStartRead;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports an error that occured while scanning.
|
||||
*
|
||||
* In a wellformed scanner (no or only correct usage of yypushback(int) and a
|
||||
* match-all fallback rule) this method will only be called with things that
|
||||
* "Can't Possibly Happen". If this method is called, something is seriously
|
||||
* wrong (e.g. a JFlex bug producing a faulty scanner etc.).
|
||||
*
|
||||
* Usual syntax/scanner level error handling should be done in error fallback
|
||||
* rules.
|
||||
*
|
||||
* @param errorCode the code of the errormessage to display
|
||||
*/
|
||||
private void zzScanError(int errorCode) {
|
||||
String message;
|
||||
try {
|
||||
message = ZZ_ERROR_MSG[errorCode];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
|
||||
}
|
||||
throw new Error(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes the specified amount of characters back into the input stream.
|
||||
*
|
||||
* They will be read again by then next call of the scanning method
|
||||
*
|
||||
* @param number the number of characters to be read again. This number must not
|
||||
* be greater than yylength()!
|
||||
*/
|
||||
public void yypushback(int number) {
|
||||
if (number > yylength())
|
||||
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||
zzMarkedPos -= number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resumes scanning until the next regular expression is matched, the end of
|
||||
* input is encountered or an I/O-Error occurs.
|
||||
*
|
||||
* @return the next token
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
|
||||
int zzInput;
|
||||
int zzAction;
|
||||
// cached fields:
|
||||
int zzCurrentPosL;
|
||||
int zzMarkedPosL;
|
||||
int zzEndReadL = zzEndRead;
|
||||
char[] zzBufferL = zzBuffer;
|
||||
char[] zzCMapL = ZZ_CMAP;
|
||||
int[] zzTransL = ZZ_TRANS;
|
||||
int[] zzRowMapL = ZZ_ROWMAP;
|
||||
int[] zzAttrL = ZZ_ATTRIBUTE;
|
||||
while (true) {
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzAction = -1;
|
||||
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
|
||||
zzState = zzLexicalState;
|
||||
zzForAction: {
|
||||
while (true) {
|
||||
if (zzCurrentPosL < zzEndReadL)
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
else if (zzAtEOF) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
// store back cached positions
|
||||
zzCurrentPos = zzCurrentPosL;
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
boolean eof = zzRefill();
|
||||
// get translated positions and possibly new buffer
|
||||
zzCurrentPosL = zzCurrentPos;
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzBufferL = zzBuffer;
|
||||
zzEndReadL = zzEndRead;
|
||||
if (eof) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
}
|
||||
}
|
||||
int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
|
||||
if (zzNext == -1)
|
||||
break zzForAction;
|
||||
zzState = zzNext;
|
||||
int zzAttributes = zzAttrL[zzState];
|
||||
if ((zzAttributes & 1) == 1) {
|
||||
zzAction = zzState;
|
||||
zzMarkedPosL = zzCurrentPosL;
|
||||
if ((zzAttributes & 8) == 8)
|
||||
break zzForAction;
|
||||
}
|
||||
}
|
||||
}
|
||||
// store back cached position
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||
case 16: {
|
||||
addToken(Token.RESERVED_WORD);
|
||||
}
|
||||
case 17:
|
||||
break;
|
||||
case 1: {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
case 18:
|
||||
break;
|
||||
case 7: {
|
||||
addToken(Token.COMMENT_EOL);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 19:
|
||||
break;
|
||||
case 2: {
|
||||
addToken(Token.WHITESPACE);
|
||||
}
|
||||
case 20:
|
||||
break;
|
||||
case 11: {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
return firstToken;
|
||||
}
|
||||
case 21:
|
||||
break;
|
||||
case 14: {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_CHAR);
|
||||
return firstToken;
|
||||
}
|
||||
case 22:
|
||||
break;
|
||||
case 12: { /* Skip escaped chars. */
|
||||
}
|
||||
case 23:
|
||||
break;
|
||||
case 4: {
|
||||
addToken(Token.OPERATOR);
|
||||
}
|
||||
case 24:
|
||||
break;
|
||||
case 15: { /*
|
||||
* Skip escaped single quotes only, but this should still work.
|
||||
*/
|
||||
}
|
||||
case 25:
|
||||
break;
|
||||
case 5: {
|
||||
start = zzMarkedPos - 1;
|
||||
yybegin(STRING);
|
||||
}
|
||||
case 26:
|
||||
break;
|
||||
case 13: {
|
||||
yybegin(YYINITIAL);
|
||||
addToken(start, zzStartRead, Token.LITERAL_CHAR);
|
||||
}
|
||||
case 27:
|
||||
break;
|
||||
case 10: {
|
||||
yybegin(YYINITIAL);
|
||||
addToken(start, zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
}
|
||||
case 28:
|
||||
break;
|
||||
case 8: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 29:
|
||||
break;
|
||||
case 9: {
|
||||
}
|
||||
case 30:
|
||||
break;
|
||||
case 3: {
|
||||
addToken(Token.SEPARATOR);
|
||||
}
|
||||
case 31:
|
||||
break;
|
||||
case 6: {
|
||||
start = zzMarkedPos - 1;
|
||||
yybegin(CHAR_LITERAL);
|
||||
}
|
||||
case 32:
|
||||
break;
|
||||
default:
|
||||
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
|
||||
zzAtEOF = true;
|
||||
switch (zzLexicalState) {
|
||||
case STRING: {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
return firstToken;
|
||||
}
|
||||
case 85:
|
||||
break;
|
||||
case CHAR_LITERAL: {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_CHAR);
|
||||
return firstToken;
|
||||
}
|
||||
case 86:
|
||||
break;
|
||||
case YYINITIAL: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 87:
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,347 +0,0 @@
|
||||
/*
|
||||
* 04/12/2012
|
||||
*
|
||||
* DtdTokenMaker.java - Generates tokens for DTD syntax highlighting.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for DTD files.
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>XMLTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 1.0
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class DtdTokenMaker
|
||||
%extends AbstractJFlexTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
/**
|
||||
* Token type specific to XMLTokenMaker denoting a line ending with an
|
||||
* unclosed XML tag; thus a new line is beginning still inside of the tag.
|
||||
*/
|
||||
public static final int INTERNAL_INTAG_START = -1;
|
||||
|
||||
/**
|
||||
* Token type specific to XMLTokenMaker denoting a line ending with an
|
||||
* unclosed DOCTYPE element.
|
||||
*/
|
||||
public static final int INTERNAL_INTAG_ELEMENT = -2;
|
||||
|
||||
/**
|
||||
* Token type specific to XMLTokenMaker denoting a line ending with an
|
||||
* unclosed, locally-defined DTD in a DOCTYPE element.
|
||||
*/
|
||||
public static final int INTERNAL_INTAG_ATTLIST = -3;
|
||||
|
||||
/**
|
||||
* Token type specific to XMLTokenMaker denoting a line ending with an
|
||||
* unclosed comment. The state to return to when this comment ends is
|
||||
* embedded in the token type as well.
|
||||
*/
|
||||
public static final int INTERNAL_IN_COMMENT = -(1<<11);
|
||||
|
||||
/**
|
||||
* The state we were in prior to the current one. This is used to know
|
||||
* what state to resume after an MLC ends.
|
||||
*/
|
||||
private int prevState;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public DtdTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens as an
|
||||
* "end token;" that is, at <code>zzMarkedPos</code>.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addEndToken(int tokenType) {
|
||||
addToken(zzMarkedPos,zzMarkedPos, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Always returns <tt>false</tt>, as you never want "mark occurrences"
|
||||
* working in XML files.
|
||||
*
|
||||
* @param type The token type.
|
||||
* @return Whether tokens of this type should have "mark occurrences"
|
||||
* enabled.
|
||||
*/
|
||||
@Override
|
||||
public boolean getMarkOccurrencesOfTokenType(int type) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
prevState = YYINITIAL;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = YYINITIAL;
|
||||
switch (initialTokenType) {
|
||||
case INTERNAL_INTAG_START:
|
||||
state = INTAG_START;
|
||||
break;
|
||||
case INTERNAL_INTAG_ELEMENT:
|
||||
state = INTAG_ELEMENT;
|
||||
break;
|
||||
case INTERNAL_INTAG_ATTLIST:
|
||||
state = INTAG_ATTLIST;
|
||||
break;
|
||||
default:
|
||||
if (initialTokenType<-1024) { // INTERNAL_IN_COMMENT - prevState
|
||||
int main = -(-initialTokenType & 0xffffff00);
|
||||
switch (main) {
|
||||
default: // Should never happen
|
||||
case INTERNAL_IN_COMMENT:
|
||||
state = COMMENT;
|
||||
break;
|
||||
}
|
||||
prevState = -initialTokenType&0xff;
|
||||
}
|
||||
else { // Shouldn't happen
|
||||
state = YYINITIAL;
|
||||
}
|
||||
}
|
||||
|
||||
start = text.offset;
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Whitespace = ([ \t\f])
|
||||
LineTerminator = ([\n])
|
||||
UnclosedString = ([\"][^\"]*)
|
||||
UnclosedChar = ([\'][^\']*)
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ([A-Za-z_0-9\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$A-Za-z0-9])
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
%state COMMENT
|
||||
%state INTAG_START
|
||||
%state INTAG_ELEMENT
|
||||
%state INTAG_ATTLIST
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
([^ \t\f<]+) { /* Not really valid */ addToken(Token.IDENTIFIER); }
|
||||
"<!--" { start = zzStartRead; prevState = zzLexicalState; yybegin(COMMENT); }
|
||||
"<!" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG_START); }
|
||||
"<" { addToken(Token.IDENTIFIER); }
|
||||
{Whitespace}+ { addToken(Token.WHITESPACE); }
|
||||
{LineTerminator} |
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
}
|
||||
|
||||
<COMMENT> {
|
||||
[^hwf\n\-]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
"-->" { int temp = zzMarkedPos; addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); start = temp; yybegin(prevState); }
|
||||
"-" {}
|
||||
{LineTerminator} |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_COMMENT - prevState); return firstToken; }
|
||||
}
|
||||
|
||||
<INTAG_START> {
|
||||
("ELEMENT") { addToken(Token.MARKUP_TAG_NAME); yybegin(INTAG_ELEMENT); }
|
||||
("ATTLIST") { addToken(Token.MARKUP_TAG_NAME); yybegin(INTAG_ATTLIST); }
|
||||
([^ \t\f>]+) { addToken(Token.IDENTIFIER); }
|
||||
{Whitespace}+ { addToken(Token.WHITESPACE); }
|
||||
(">") { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
|
||||
<<EOF>> { addEndToken(INTERNAL_INTAG_START); return firstToken; }
|
||||
}
|
||||
|
||||
<INTAG_ELEMENT> {
|
||||
([^ \t\f>]+) { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
|
||||
{Whitespace}+ { addToken(Token.WHITESPACE); }
|
||||
(">") { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
|
||||
<<EOF>> { addEndToken(INTERNAL_INTAG_ELEMENT); return firstToken; }
|
||||
}
|
||||
|
||||
<INTAG_ATTLIST> {
|
||||
("CDATA"|"#IMPLIED"|"#REQUIRED") { addToken(Token.MARKUP_PROCESSING_INSTRUCTION); }
|
||||
([^ \t\f>\"\']+) { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
|
||||
({UnclosedString}[\"]?) { addToken(Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
|
||||
({UnclosedChar}[\']?) { addToken(Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
|
||||
{Whitespace}+ { addToken(Token.WHITESPACE); }
|
||||
(">") { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
|
||||
<<EOF>> { addEndToken(INTERNAL_INTAG_ATTLIST); return firstToken; }
|
||||
}
|
||||
@@ -1,769 +0,0 @@
|
||||
/* The following code was generated by JFlex 1.4.1 on 7/9/16 6:48 PM */
|
||||
/*
|
||||
* 04/12/2012
|
||||
* DtdTokenMaker.java - Generates tokens for DTD syntax highlighting.
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
|
||||
import org.fife.ui.rsyntaxtextarea.Token;
|
||||
import org.fife.ui.rsyntaxtextarea.TokenImpl;
|
||||
|
||||
/**
|
||||
* Scanner for DTD files.
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost completely
|
||||
* removed to be competitive with the handwritten lexers (subclasses of
|
||||
* <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around). We can
|
||||
* achieve this because RText always scans exactly 1 line of tokens at a time,
|
||||
* and hands the scanner this line as an array of characters (a Segment really).
|
||||
* Since tokens contain pointers to char arrays instead of Strings holding their
|
||||
* contents, there is no need for allocating new memory for Strings.
|
||||
* <p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.
|
||||
* <p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>XMLTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>. You
|
||||
* should hand-delete the second of each definition (the ones generated by the
|
||||
* lexer), as these generated methods modify the input buffer, which we'll never
|
||||
* have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT be
|
||||
* initialized. This is a needless memory allocation for us since we will be
|
||||
* pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would with
|
||||
* any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 1.0
|
||||
*/
|
||||
public class DtdTokenMaker extends AbstractJFlexTokenMaker {
|
||||
|
||||
/** This character denotes the end of file */
|
||||
public static final int YYEOF = -1;
|
||||
/** lexical states */
|
||||
public static final int INTAG_START = 2;
|
||||
public static final int INTAG_ELEMENT = 3;
|
||||
public static final int YYINITIAL = 0;
|
||||
public static final int INTAG_ATTLIST = 4;
|
||||
public static final int COMMENT = 1;
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final String ZZ_CMAP_PACKED = "\11\0\1\1\1\2\1\0\1\1\23\0\1\1\1\24\1\3\1\41"
|
||||
+ "\1\7\1\5\1\5\1\4\5\5\1\25\1\22\1\6\12\7\1\20" + "\1\5\1\23\1\5\1\26\2\5\1\34\1\7\1\37\1\40\1\27"
|
||||
+ "\3\7\1\35\2\7\1\30\1\31\1\32\1\7\1\42\1\44\1\43" + "\1\36\1\33\1\45\5\7\1\5\1\0\1\5\1\0\1\5\1\0"
|
||||
+ "\4\7\1\17\1\14\1\7\1\10\1\15\2\7\1\16\3\7\1\12" + "\2\7\1\13\1\11\2\7\1\21\3\7\3\0\1\5\uff81\0";
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
|
||||
/**
|
||||
* Translates DFA states to action switch labels.
|
||||
*/
|
||||
private static final int[] ZZ_ACTION = zzUnpackAction();
|
||||
private static final String ZZ_ACTION_PACKED_0 = "\5\0\1\1\1\2\1\3\1\4\1\5\4\4\1\3"
|
||||
+ "\1\6\2\3\2\7\2\10\2\7\1\11\5\0\2\3" + "\1\10\3\7\5\0\1\12\2\3\3\7\1\13\2\0"
|
||||
+ "\1\14\2\3\3\7\2\0\2\3\1\15\2\7\2\3" + "\2\7\1\16\1\17\1\7";
|
||||
|
||||
private static int[] zzUnpackAction() {
|
||||
int[] result = new int[70];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAction(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a state to a row index in the transition table
|
||||
*/
|
||||
private static final int[] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\46\0\114\0\162\0\230\0\276\0\344\0\u010a"
|
||||
+ "\0\u0130\0\u0156\0\u017c\0\u01a2\0\u01c8\0\u01ee\0\u0214\0\u0156"
|
||||
+ "\0\u023a\0\u0260\0\u0286\0\u02ac\0\u02d2\0\u02f8\0\u031e\0\u0344"
|
||||
+ "\0\u036a\0\u0390\0\u03b6\0\u03dc\0\u0402\0\u0428\0\u044e\0\u0474"
|
||||
+ "\0\u0156\0\u049a\0\u04c0\0\u04e6\0\u050c\0\u0532\0\u0558\0\u057e"
|
||||
+ "\0\u05a4\0\u0156\0\u05ca\0\u05f0\0\u0616\0\u063c\0\u0662\0\u0156"
|
||||
+ "\0\u0688\0\u06ae\0\u06d4\0\u06fa\0\u0720\0\u0746\0\u076c\0\u0792"
|
||||
+ "\0\u07b8\0\u06d4\0\u07de\0\u0804\0\u02ac\0\u082a\0\u0850\0\u0876"
|
||||
+ "\0\u089c\0\u08c2\0\u08e8\0\u0214\0\u0214\0\u090e";
|
||||
|
||||
private static int[] zzUnpackRowMap() {
|
||||
int[] result = new int[70];
|
||||
int offset = 0;
|
||||
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackRowMap(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int high = packed.charAt(i++) << 16;
|
||||
result[j++] = high | packed.charAt(i++);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* The transition table of the DFA
|
||||
*/
|
||||
private static final int[] ZZ_TRANS = zzUnpackTrans();
|
||||
private static final String ZZ_TRANS_PACKED_0 = "\1\6\1\7\21\6\1\10\22\6\2\11\1\12\5\11"
|
||||
+ "\1\13\3\11\1\14\4\11\1\15\3\11\1\16\20\11" + "\1\17\1\7\24\17\1\20\1\21\4\17\1\22\11\17"
|
||||
+ "\1\23\1\7\24\23\1\20\17\23\1\24\1\7\1\24" + "\1\25\1\26\21\24\1\20\10\24\1\27\1\24\1\30"
|
||||
+ "\4\24\1\6\1\0\21\6\1\0\22\6\1\0\1\7" + "\70\0\1\31\21\0\2\11\1\0\5\11\1\0\3\11"
|
||||
+ "\1\0\4\11\1\0\3\11\1\0\20\11\57\0\1\32" + "\45\0\1\33\3\0\1\34\51\0\1\35\51\0\1\36"
|
||||
+ "\20\0\1\17\1\0\24\17\1\0\20\17\1\0\24\17" + "\1\0\1\17\1\37\16\17\1\0\24\17\1\0\4\17"
|
||||
+ "\1\40\12\17\1\23\1\0\24\23\1\0\17\23\1\24" + "\1\0\1\24\2\0\21\24\1\0\17\24\3\25\1\41"
|
||||
+ "\42\25\4\26\1\41\41\26\1\24\1\0\1\24\2\0" + "\21\24\1\0\11\24\1\42\6\24\1\0\1\24\2\0"
|
||||
+ "\21\24\1\0\6\24\1\43\5\24\1\44\2\24\25\0" + "\1\45\31\0\1\46\46\0\1\47\51\0\1\50\50\0"
|
||||
+ "\1\51\52\0\1\52\17\0\1\17\1\0\24\17\1\0" + "\1\53\17\17\1\0\24\17\1\0\4\17\1\54\12\17"
|
||||
+ "\1\24\1\0\1\24\2\0\21\24\1\0\5\24\1\55" + "\12\24\1\0\1\24\2\0\21\24\1\0\2\24\1\56"
|
||||
+ "\15\24\1\0\1\24\2\0\21\24\1\0\1\57\16\24" + "\25\0\1\60\32\0\1\61\53\0\1\62\44\0\1\47"
|
||||
+ "\50\0\1\63\23\0\1\17\1\0\24\17\1\0\2\17" + "\1\64\15\17\1\0\24\17\1\0\1\17\1\65\15\17"
|
||||
+ "\1\24\1\0\1\24\2\0\21\24\1\0\4\24\1\66" + "\13\24\1\0\1\24\2\0\21\24\1\0\13\24\1\67"
|
||||
+ "\4\24\1\0\1\24\2\0\21\24\1\0\15\24\1\70" + "\1\24\13\0\1\47\4\0\1\62\33\0\1\71\43\0"
|
||||
+ "\2\72\12\63\1\72\1\63\1\72\1\0\2\72\1\0" + "\12\63\1\72\4\63\1\17\1\0\24\17\1\0\1\73"
|
||||
+ "\17\17\1\0\24\17\1\0\6\17\1\74\10\17\1\24" + "\1\0\1\24\2\0\21\24\1\0\5\24\1\75\12\24"
|
||||
+ "\1\0\1\24\2\0\21\24\1\0\1\24\1\76\16\24" + "\1\0\1\24\2\0\21\24\1\0\16\24\1\77\6\0"
|
||||
+ "\1\63\37\0\1\17\1\0\24\17\1\0\3\17\1\100" + "\14\17\1\0\24\17\1\0\7\17\1\101\7\17\1\24"
|
||||
+ "\1\0\1\24\2\0\21\24\1\0\6\24\1\102\11\24" + "\1\0\1\24\2\0\21\24\1\0\6\24\1\103\10\24"
|
||||
+ "\1\17\1\0\24\17\1\0\4\17\1\104\13\17\1\0" + "\24\17\1\0\4\17\1\105\12\17\1\24\1\0\1\24"
|
||||
+ "\2\0\21\24\1\0\1\106\17\24\1\0\1\24\2\0" + "\21\24\1\0\14\24\1\102\3\24\1\0\1\24\2\0"
|
||||
+ "\21\24\1\0\11\24\1\75\5\24";
|
||||
|
||||
private static int[] zzUnpackTrans() {
|
||||
int[] result = new int[2356];
|
||||
int offset = 0;
|
||||
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackTrans(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
value--;
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/* error codes */
|
||||
private static final int ZZ_UNKNOWN_ERROR = 0;
|
||||
private static final int ZZ_NO_MATCH = 1;
|
||||
private static final int ZZ_PUSHBACK_2BIG = 2;
|
||||
/* error messages for the codes above */
|
||||
private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input",
|
||||
"Error: pushback value was too large" };
|
||||
/**
|
||||
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
|
||||
*/
|
||||
private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 = "\5\0\4\1\1\11\5\1\1\11\11\1\5\0\2\1"
|
||||
+ "\1\11\3\1\5\0\1\11\5\1\1\11\2\0\6\1" + "\2\0\14\1";
|
||||
|
||||
private static int[] zzUnpackAttribute() {
|
||||
int[] result = new int[70];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAttribute(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/** the input device */
|
||||
private java.io.Reader zzReader;
|
||||
/** the current state of the DFA */
|
||||
private int zzState;
|
||||
/** the current lexical state */
|
||||
private int zzLexicalState = YYINITIAL;
|
||||
/**
|
||||
* this buffer contains the current text to be matched and is the source of the
|
||||
* yytext() string
|
||||
*/
|
||||
private char zzBuffer[];
|
||||
/** the textposition at the last accepting state */
|
||||
private int zzMarkedPos;
|
||||
/** the current text position in the buffer */
|
||||
private int zzCurrentPos;
|
||||
/** startRead marks the beginning of the yytext() string in the buffer */
|
||||
private int zzStartRead;
|
||||
/**
|
||||
* endRead marks the last character in the buffer, that has been read from input
|
||||
*/
|
||||
private int zzEndRead;
|
||||
/** zzAtEOF == true <=> the scanner is at the EOF */
|
||||
private boolean zzAtEOF;
|
||||
/* user code: */
|
||||
/**
|
||||
* Token type specific to XMLTokenMaker denoting a line ending with an unclosed
|
||||
* XML tag; thus a new line is beginning still inside of the tag.
|
||||
*/
|
||||
public static final int INTERNAL_INTAG_START = -1;
|
||||
/**
|
||||
* Token type specific to XMLTokenMaker denoting a line ending with an unclosed
|
||||
* DOCTYPE element.
|
||||
*/
|
||||
public static final int INTERNAL_INTAG_ELEMENT = -2;
|
||||
/**
|
||||
* Token type specific to XMLTokenMaker denoting a line ending with an unclosed,
|
||||
* locally-defined DTD in a DOCTYPE element.
|
||||
*/
|
||||
public static final int INTERNAL_INTAG_ATTLIST = -3;
|
||||
/**
|
||||
* Token type specific to XMLTokenMaker denoting a line ending with an unclosed
|
||||
* comment. The state to return to when this comment ends is embedded in the
|
||||
* token type as well.
|
||||
*/
|
||||
public static final int INTERNAL_IN_COMMENT = -(1 << 11);
|
||||
/**
|
||||
* The state we were in prior to the current one. This is used to know what
|
||||
* state to resume after an MLC ends.
|
||||
*/
|
||||
private int prevState;
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a no-parameter
|
||||
* constructor.
|
||||
*/
|
||||
public DtdTokenMaker() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens as an "end
|
||||
* token;" that is, at <code>zzMarkedPos</code>.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addEndToken(int tokenType) {
|
||||
addToken(zzMarkedPos, zzMarkedPos, tokenType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos - 1, tokenType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start, end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
/**
|
||||
* Always returns <tt>false</tt>, as you never want "mark occurrences" working
|
||||
* in XML files.
|
||||
*
|
||||
* @param type The token type.
|
||||
* @return Whether tokens of this type should have "mark occurrences" enabled.
|
||||
*/
|
||||
@Override
|
||||
public boolean getMarkOccurrencesOfTokenType(int type) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated from
|
||||
* <code>text</code>. This method must be implemented by subclasses so they can
|
||||
* correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing the syntax
|
||||
* highlighted text.
|
||||
*/
|
||||
@Override
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
prevState = YYINITIAL;
|
||||
// Start off in the proper state.
|
||||
int state = YYINITIAL;
|
||||
switch (initialTokenType) {
|
||||
case INTERNAL_INTAG_START:
|
||||
state = INTAG_START;
|
||||
break;
|
||||
case INTERNAL_INTAG_ELEMENT:
|
||||
state = INTAG_ELEMENT;
|
||||
break;
|
||||
case INTERNAL_INTAG_ATTLIST:
|
||||
state = INTAG_ATTLIST;
|
||||
break;
|
||||
default:
|
||||
if (initialTokenType < -1024) { // INTERNAL_IN_COMMENT -
|
||||
// prevState
|
||||
int main = -(-initialTokenType & 0xffffff00);
|
||||
switch (main) {
|
||||
default: // Should never happen
|
||||
case INTERNAL_IN_COMMENT:
|
||||
state = COMMENT;
|
||||
break;
|
||||
}
|
||||
prevState = -initialTokenType & 0xff;
|
||||
} else { // Shouldn't happen
|
||||
state = YYINITIAL;
|
||||
}
|
||||
}
|
||||
start = text.offset;
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos >= s.offset + s.count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream. Does not close the old
|
||||
* reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream <b>cannot</b> be
|
||||
* reused (internal buffer is discarded and lost). Lexical state is set to
|
||||
* <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill no longer
|
||||
* "refills" the buffer (since the way we do it, it's always "full" the first
|
||||
* time through, since it points to the segment's array). So, we assign
|
||||
* zzEndRead here.
|
||||
*/
|
||||
// zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner There is also a java.io.InputStream version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
public DtdTokenMaker(java.io.Reader in) {
|
||||
this.zzReader = in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner. There is also java.io.Reader version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Inputstream to read input from.
|
||||
*/
|
||||
public DtdTokenMaker(java.io.InputStream in) {
|
||||
this(new java.io.InputStreamReader(in));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unpacks the compressed character translation table.
|
||||
*
|
||||
* @param packed the packed character translation table
|
||||
* @return the unpacked character translation table
|
||||
*/
|
||||
private static char[] zzUnpackCMap(String packed) {
|
||||
char[] map = new char[0x10000];
|
||||
int i = 0; /* index in packed string */
|
||||
int j = 0; /* index in unpacked array */
|
||||
while (i < 138) {
|
||||
int count = packed.charAt(i++);
|
||||
char value = packed.charAt(i++);
|
||||
do
|
||||
map[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the input stream.
|
||||
*/
|
||||
public final void yyclose() throws java.io.IOException {
|
||||
zzAtEOF = true; /* indicate end of file */
|
||||
zzEndRead = zzStartRead; /* invalidate buffer */
|
||||
if (zzReader != null)
|
||||
zzReader.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current lexical state.
|
||||
*/
|
||||
public final int yystate() {
|
||||
return zzLexicalState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enters a new lexical state
|
||||
*
|
||||
* @param newState the new lexical state
|
||||
*/
|
||||
@Override
|
||||
public final void yybegin(int newState) {
|
||||
zzLexicalState = newState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the text matched by the current regular expression.
|
||||
*/
|
||||
public final String yytext() {
|
||||
return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character at position <tt>pos</tt> from the matched text.
|
||||
*
|
||||
* It is equivalent to yytext().charAt(pos), but faster
|
||||
*
|
||||
* @param pos the position of the character to fetch. A value from 0 to
|
||||
* yylength()-1.
|
||||
*
|
||||
* @return the character at position pos
|
||||
*/
|
||||
public final char yycharat(int pos) {
|
||||
return zzBuffer[zzStartRead + pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the length of the matched text region.
|
||||
*/
|
||||
public final int yylength() {
|
||||
return zzMarkedPos - zzStartRead;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports an error that occured while scanning.
|
||||
*
|
||||
* In a wellformed scanner (no or only correct usage of yypushback(int) and a
|
||||
* match-all fallback rule) this method will only be called with things that
|
||||
* "Can't Possibly Happen". If this method is called, something is seriously
|
||||
* wrong (e.g. a JFlex bug producing a faulty scanner etc.).
|
||||
*
|
||||
* Usual syntax/scanner level error handling should be done in error fallback
|
||||
* rules.
|
||||
*
|
||||
* @param errorCode the code of the errormessage to display
|
||||
*/
|
||||
private void zzScanError(int errorCode) {
|
||||
String message;
|
||||
try {
|
||||
message = ZZ_ERROR_MSG[errorCode];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
|
||||
}
|
||||
throw new Error(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes the specified amount of characters back into the input stream.
|
||||
*
|
||||
* They will be read again by then next call of the scanning method
|
||||
*
|
||||
* @param number the number of characters to be read again. This number must not
|
||||
* be greater than yylength()!
|
||||
*/
|
||||
public void yypushback(int number) {
|
||||
if (number > yylength())
|
||||
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||
zzMarkedPos -= number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resumes scanning until the next regular expression is matched, the end of
|
||||
* input is encountered or an I/O-Error occurs.
|
||||
*
|
||||
* @return the next token
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
|
||||
int zzInput;
|
||||
int zzAction;
|
||||
// cached fields:
|
||||
int zzCurrentPosL;
|
||||
int zzMarkedPosL;
|
||||
int zzEndReadL = zzEndRead;
|
||||
char[] zzBufferL = zzBuffer;
|
||||
char[] zzCMapL = ZZ_CMAP;
|
||||
int[] zzTransL = ZZ_TRANS;
|
||||
int[] zzRowMapL = ZZ_ROWMAP;
|
||||
int[] zzAttrL = ZZ_ATTRIBUTE;
|
||||
while (true) {
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzAction = -1;
|
||||
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
|
||||
zzState = zzLexicalState;
|
||||
zzForAction: {
|
||||
while (true) {
|
||||
if (zzCurrentPosL < zzEndReadL)
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
else if (zzAtEOF) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
// store back cached positions
|
||||
zzCurrentPos = zzCurrentPosL;
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
boolean eof = zzRefill();
|
||||
// get translated positions and possibly new buffer
|
||||
zzCurrentPosL = zzCurrentPos;
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzBufferL = zzBuffer;
|
||||
zzEndReadL = zzEndRead;
|
||||
if (eof) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
}
|
||||
}
|
||||
int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
|
||||
if (zzNext == -1)
|
||||
break zzForAction;
|
||||
zzState = zzNext;
|
||||
int zzAttributes = zzAttrL[zzState];
|
||||
if ((zzAttributes & 1) == 1) {
|
||||
zzAction = zzState;
|
||||
zzMarkedPosL = zzCurrentPosL;
|
||||
if ((zzAttributes & 8) == 8)
|
||||
break zzForAction;
|
||||
}
|
||||
}
|
||||
}
|
||||
// store back cached position
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||
case 3: {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
case 16:
|
||||
break;
|
||||
case 2: {
|
||||
addToken(Token.WHITESPACE);
|
||||
}
|
||||
case 17:
|
||||
break;
|
||||
case 1: {
|
||||
/* Not really valid */ addToken(Token.IDENTIFIER);
|
||||
}
|
||||
case 18:
|
||||
break;
|
||||
case 12: {
|
||||
int temp = zzStartRead;
|
||||
addToken(start, zzStartRead - 1, Token.MARKUP_COMMENT);
|
||||
addHyperlinkToken(temp, zzMarkedPos - 1, Token.MARKUP_COMMENT);
|
||||
start = zzMarkedPos;
|
||||
}
|
||||
case 19:
|
||||
break;
|
||||
case 9: {
|
||||
addToken(Token.MARKUP_TAG_DELIMITER);
|
||||
yybegin(INTAG_START);
|
||||
}
|
||||
case 20:
|
||||
break;
|
||||
case 6: {
|
||||
addToken(Token.MARKUP_TAG_DELIMITER);
|
||||
yybegin(YYINITIAL);
|
||||
}
|
||||
case 21:
|
||||
break;
|
||||
case 10: {
|
||||
int temp = zzMarkedPos;
|
||||
addToken(start, zzStartRead + 2, Token.MARKUP_COMMENT);
|
||||
start = temp;
|
||||
yybegin(prevState);
|
||||
}
|
||||
case 22:
|
||||
break;
|
||||
case 11: {
|
||||
start = zzStartRead;
|
||||
prevState = zzLexicalState;
|
||||
yybegin(COMMENT);
|
||||
}
|
||||
case 23:
|
||||
break;
|
||||
case 7: {
|
||||
addToken(Token.MARKUP_TAG_ATTRIBUTE);
|
||||
}
|
||||
case 24:
|
||||
break;
|
||||
case 15: {
|
||||
addToken(Token.MARKUP_TAG_NAME);
|
||||
yybegin(INTAG_ATTLIST);
|
||||
}
|
||||
case 25:
|
||||
break;
|
||||
case 14: {
|
||||
addToken(Token.MARKUP_TAG_NAME);
|
||||
yybegin(INTAG_ELEMENT);
|
||||
}
|
||||
case 26:
|
||||
break;
|
||||
case 13: {
|
||||
addToken(Token.MARKUP_PROCESSING_INSTRUCTION);
|
||||
}
|
||||
case 27:
|
||||
break;
|
||||
case 4: {
|
||||
}
|
||||
case 28:
|
||||
break;
|
||||
case 5: {
|
||||
addToken(start, zzStartRead - 1, Token.MARKUP_COMMENT);
|
||||
addEndToken(INTERNAL_IN_COMMENT - prevState);
|
||||
return firstToken;
|
||||
}
|
||||
case 29:
|
||||
break;
|
||||
case 8: {
|
||||
addToken(Token.MARKUP_TAG_ATTRIBUTE_VALUE);
|
||||
}
|
||||
case 30:
|
||||
break;
|
||||
default:
|
||||
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
|
||||
zzAtEOF = true;
|
||||
switch (zzLexicalState) {
|
||||
case INTAG_START: {
|
||||
addEndToken(INTERNAL_INTAG_START);
|
||||
return firstToken;
|
||||
}
|
||||
case 71:
|
||||
break;
|
||||
case INTAG_ELEMENT: {
|
||||
addEndToken(INTERNAL_INTAG_ELEMENT);
|
||||
return firstToken;
|
||||
}
|
||||
case 72:
|
||||
break;
|
||||
case YYINITIAL: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 73:
|
||||
break;
|
||||
case INTAG_ATTLIST: {
|
||||
addEndToken(INTERNAL_INTAG_ATTLIST);
|
||||
return firstToken;
|
||||
}
|
||||
case 74:
|
||||
break;
|
||||
case COMMENT: {
|
||||
addToken(start, zzStartRead - 1, Token.MARKUP_COMMENT);
|
||||
addEndToken(INTERNAL_IN_COMMENT - prevState);
|
||||
return firstToken;
|
||||
}
|
||||
case 75:
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,477 +0,0 @@
|
||||
/*
|
||||
* 03/23/2005
|
||||
*
|
||||
* FortranTokenMaker.java - Scanner for the Fortran programming language.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for the Fortran programming language.
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>FortranTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.4
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class FortranTokenMaker
|
||||
%extends AbstractJFlexTokenMaker
|
||||
%unicode
|
||||
%ignorecase
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. We must have this here as there is no default,
|
||||
* no-parameter constructor generated by JFlex.
|
||||
*/
|
||||
public FortranTokenMaker() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "!", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = STRING;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.LITERAL_CHAR:
|
||||
state = CHAR;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
LineTerminator = (\n)
|
||||
WhiteSpace = ([ \t\f])
|
||||
|
||||
Column1CommentBegin = ([C\*])
|
||||
Column1Comment2Begin = (D)
|
||||
AnywhereCommentBegin = (\!)
|
||||
|
||||
Identifier = ([A-Za-z0-9_$]+)
|
||||
|
||||
StringDelimiter = (\")
|
||||
CharDelimiter = (\')
|
||||
|
||||
Operators1 = ("<"|">"|"<="|">="|"&"|"/="|"==")
|
||||
Operators2 = (\.(lt|gt|eq|ne|le|ge|and|or)\.)
|
||||
Operator = ({Operators1}|{Operators2})
|
||||
|
||||
Boolean = (\.(true|false)\.)
|
||||
|
||||
%state STRING
|
||||
%state CHAR
|
||||
|
||||
%%
|
||||
|
||||
/* Keywords */
|
||||
<YYINITIAL> "INCLUDE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "PROGRAM" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "MODULE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "SUBROUTINE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "FUNCTION" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "CONTAINS" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "USE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "CALL" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "RETURN" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "IMPLICIT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "EXPLICIT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "NONE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DATA" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "PARAMETER" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ALLOCATE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ALLOCATABLE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ALLOCATED" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DEALLOCATE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "INTEGER" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "REAL" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DOUBLE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "PRECISION" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "COMPLEX" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "LOGICAL" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "CHARACTER" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DIMENSION" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "KIND" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "CASE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "SELECT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DEFAULT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "CONTINUE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "CYCLE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DO" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "WHILE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ELSE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "IF" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ELSEIF" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "THEN" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ELSEWHERE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "END" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ENDIF" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ENDDO" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "FORALL" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "WHERE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "EXIT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "GOTO" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "PAUSE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "STOP" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "BACKSPACE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "CLOSE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ENDFILE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "INQUIRE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "OPEN" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "PRINT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "READ" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "REWIND" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "WRITE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "FORMAT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "AIMAG" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "AINT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "AMAX0" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "AMIN0" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ANINT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "CEILING" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "CMPLX" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "CONJG" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DBLE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DCMPLX" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DFLOAT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DIM" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DPROD" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "FLOAT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "FLOOR" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "IFIX" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "IMAG" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "INT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "LOGICAL" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "MODULO" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "NINT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "REAL" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "SIGN" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "SNGL" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "TRANSFER" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ZEXT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ABS" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ACOS" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "AIMAG" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "AINT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ALOG" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ALOG10" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "AMAX0" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "AMAX1" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "AMIN0" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "AMIN1" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "AMOD" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ANINT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ASIN" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ATAN" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ATAN2" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "CABS" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "CCOS" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "CHAR" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "CLOG" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "CMPLX" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "CONJG" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "COS" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "COSH" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "CSIN" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "CSQRT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DABS" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DACOS" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DASIN" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DATAN" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DATAN2" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DBLE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DCOS" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DCOSH" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DDIM" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DEXP" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DIM" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DINT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DLOG" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DLOG10" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DMAX1" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DMIN1" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DMOD" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DNINT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DPROD" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DREAL" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DSIGN" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DSIN" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DSINH" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DSQRT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DTAN" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "DTANH" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "EXP" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "FLOAT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "IABS" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ICHAR" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "IDIM" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "IDINT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "IDNINT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "IFIX" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "INDEX" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "INT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ISIGN" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "LEN" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "LGE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "LGT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "LLE" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "LLT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "LOG" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "LOG10" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "MAX" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "MAX0" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "MAX1" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "MIN" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "MIN0" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "MIN1" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "MOD" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "NINT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "REAL" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "SIGN" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "SIN" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "SINH" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "SNGL" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "SQRT" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "TAN" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "TANH" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
|
||||
{WhiteSpace}+ { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* String/Character Literals. */
|
||||
{CharDelimiter} { start = zzMarkedPos-1; yybegin(CHAR); }
|
||||
{StringDelimiter} { start = zzMarkedPos-1; yybegin(STRING); }
|
||||
|
||||
/* Comment Literals. */
|
||||
/* Note that we cannot combine these as JFLex doesn't like combining an */
|
||||
/* expression containing the beginning-of-line character '^'. */
|
||||
{Column1CommentBegin} {
|
||||
// Since we change zzStartRead, we have the unfortunate
|
||||
// side-effect of not being able to use the '^' operator.
|
||||
// So we must check whether we're really at the beginning
|
||||
// of the line ourselves...
|
||||
if (zzStartRead==s.offset) {
|
||||
addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
else {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
}
|
||||
{Column1Comment2Begin} {
|
||||
// Since we change zzStartRead, we have the unfortunate
|
||||
// side-effect of not being able to use the '^' operator.
|
||||
// So we must check whether we're really at the beginning
|
||||
// of the line ourselves...
|
||||
if (zzStartRead==s.offset) {
|
||||
addToken(zzStartRead,zzEndRead, Token.COMMENT_DOCUMENTATION);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
else {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
}
|
||||
{AnywhereCommentBegin} { addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
|
||||
/* Operators. */
|
||||
{Operator} { addToken(Token.OPERATOR); }
|
||||
|
||||
/* Boolean literals. */
|
||||
{Boolean} { addToken(Token.LITERAL_BOOLEAN); }
|
||||
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
/* Ended with a line not in a string or char literal. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters. */
|
||||
. { addToken(Token.IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
<CHAR> {
|
||||
[^\'\n]* {}
|
||||
\' { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
|
||||
}
|
||||
|
||||
<STRING> {
|
||||
[^\"\n]* {}
|
||||
\" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
}
|
||||
@@ -1,842 +0,0 @@
|
||||
/* The following code was generated by JFlex 1.4.1 on 10/16/06 10:31 AM */
|
||||
/*
|
||||
* 03/23/2005
|
||||
* FortranTokenMaker.java - Scanner for the Fortran programming language.
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
|
||||
import org.fife.ui.rsyntaxtextarea.Token;
|
||||
import org.fife.ui.rsyntaxtextarea.TokenImpl;
|
||||
|
||||
/**
|
||||
* Scanner for the Fortran programming language.
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost completely
|
||||
* removed to be competitive with the handwritten lexers (subclasses of
|
||||
* <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around). We can
|
||||
* achieve this because RText always scans exactly 1 line of tokens at a time,
|
||||
* and hands the scanner this line as an array of characters (a Segment really).
|
||||
* Since tokens contain pointers to char arrays instead of Strings holding their
|
||||
* contents, there is no need for allocating new memory for Strings.
|
||||
* <p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.
|
||||
* <p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>FortranTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>. You
|
||||
* should hand-delete the second of each definition (the ones generated by the
|
||||
* lexer), as these generated methods modify the input buffer, which we'll never
|
||||
* have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT be
|
||||
* initialized. This is a needless memory allocation for us since we will be
|
||||
* pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would with
|
||||
* any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.4
|
||||
*
|
||||
*/
|
||||
public class FortranTokenMaker extends AbstractJFlexTokenMaker {
|
||||
|
||||
/** This character denotes the end of file */
|
||||
public static final int YYEOF = -1;
|
||||
/** lexical states */
|
||||
public static final int STRING = 1;
|
||||
public static final int YYINITIAL = 0;
|
||||
public static final int CHAR = 2;
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final String ZZ_CMAP_PACKED = "\11\0\1\2\1\1\1\0\1\2\23\0\1\2\1\5\1\10\1\0"
|
||||
+ "\1\6\1\0\1\14\1\11\2\0\1\3\3\0\1\16\1\15\1\45" + "\1\50\1\51\7\6\2\0\1\12\1\13\1\12\2\0\1\25\1\37"
|
||||
+ "\1\7\1\4\1\22\1\31\1\21\1\41\1\33\1\46\1\42\1\17" + "\1\36\1\24\1\26\1\35\1\23\1\27\1\32\1\20\1\30\1\6"
|
||||
+ "\1\44\1\40\1\43\1\47\4\0\1\6\1\0\1\25\1\37\1\34" + "\1\4\1\22\1\31\1\21\1\41\1\33\1\46\1\42\1\17\1\36"
|
||||
+ "\1\24\1\26\1\35\1\23\1\27\1\32\1\20\1\30\1\6\1\44" + "\1\40\1\43\1\47\uff85\0";
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
|
||||
/**
|
||||
* Translates DFA states to action switch labels.
|
||||
*/
|
||||
private static final int[] ZZ_ACTION = zzUnpackAction();
|
||||
private static final String ZZ_ACTION_PACKED_0 = "\1\0\2\1\1\2\1\3\1\4\1\5\1\6\1\7"
|
||||
+ "\1\2\1\5\1\10\1\11\1\12\1\2\1\12\24\2" + "\1\1\1\13\1\14\1\1\1\15\1\16\7\2\1\17"
|
||||
+ "\20\2\7\0\41\2\1\17\27\2\1\17\10\2\1\17" + "\3\2\4\0\2\17\3\2\2\17\20\2\1\17\10\2"
|
||||
+ "\2\17\3\2\1\17\2\2\1\17\6\2\1\17\2\0" + "\3\2\1\17\4\2\1\17\26\2\1\0\20\2\1\20" + "\12\2\1\17";
|
||||
|
||||
private static int[] zzUnpackAction() {
|
||||
int[] result = new int[257];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAction(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a state to a row index in the transition table
|
||||
*/
|
||||
private static final int[] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\52\0\124\0\176\0\176\0\250\0\176\0\322"
|
||||
+ "\0\176\0\374\0\u0126\0\176\0\176\0\u0150\0\u0150\0\176"
|
||||
+ "\0\u017a\0\u01a4\0\u01ce\0\u01f8\0\u0222\0\u024c\0\u0276\0\u02a0"
|
||||
+ "\0\u02ca\0\u02f4\0\u031e\0\u0348\0\u0372\0\u0126\0\u039c\0\u03c6"
|
||||
+ "\0\u03f0\0\u041a\0\u0444\0\u046e\0\u0498\0\176\0\176\0\u04c2"
|
||||
+ "\0\176\0\176\0\u04ec\0\u0516\0\u0540\0\u056a\0\u0594\0\u05be"
|
||||
+ "\0\u05e8\0\u0612\0\u063c\0\u0666\0\u0690\0\u06ba\0\u06e4\0\u070e"
|
||||
+ "\0\u0738\0\u0762\0\u078c\0\u07b6\0\u07e0\0\u080a\0\u0834\0\u085e"
|
||||
+ "\0\u0888\0\u08b2\0\u08dc\0\u0906\0\u0930\0\u095a\0\u0984\0\u09ae"
|
||||
+ "\0\u09d8\0\u0a02\0\u0a2c\0\u0a56\0\u0a80\0\u0aaa\0\u0ad4\0\u0afe"
|
||||
+ "\0\u0b28\0\u0b52\0\u0b7c\0\u0ba6\0\u0bd0\0\u0bfa\0\u0c24\0\u0c4e"
|
||||
+ "\0\u0c78\0\u0ca2\0\u0ccc\0\u0cf6\0\u0d20\0\u0d4a\0\u0d74\0\u0d9e"
|
||||
+ "\0\u0dc8\0\u0df2\0\u0e1c\0\u0e46\0\u0e70\0\u0e9a\0\u0ec4\0\u0eee"
|
||||
+ "\0\u0f18\0\u0f42\0\u0f6c\0\u0f96\0\u0fc0\0\u0fea\0\u1014\0\u103e"
|
||||
+ "\0\u1068\0\u1092\0\u10bc\0\u10e6\0\u1110\0\u113a\0\u1164\0\u118e"
|
||||
+ "\0\u11b8\0\u11e2\0\u120c\0\u1236\0\u1260\0\u128a\0\u12b4\0\u12de"
|
||||
+ "\0\u1308\0\u1332\0\u135c\0\u1386\0\u13b0\0\u13da\0\u1404\0\u142e"
|
||||
+ "\0\u1458\0\u1482\0\u14ac\0\u14d6\0\u1500\0\u152a\0\u1554\0\u157e"
|
||||
+ "\0\u15a8\0\u15d2\0\u15fc\0\374\0\u1626\0\u1650\0\u167a\0\u16a4"
|
||||
+ "\0\u16ce\0\u16f8\0\u1722\0\u174c\0\u1776\0\u17a0\0\u17ca\0\u17f4"
|
||||
+ "\0\u181e\0\u1848\0\u1872\0\u189c\0\u18c6\0\u18f0\0\u191a\0\u1944"
|
||||
+ "\0\u196e\0\u1998\0\u19c2\0\u19ec\0\u1a16\0\u1a40\0\u1a6a\0\u16f8"
|
||||
+ "\0\u1a94\0\u1abe\0\u1ae8\0\u1b12\0\u1b3c\0\u1b66\0\u1b90\0\u1bba"
|
||||
+ "\0\u1be4\0\u1c0e\0\u1c38\0\u174c\0\u1c62\0\u1c8c\0\u1cb6\0\u1ce0"
|
||||
+ "\0\u1d0a\0\u1d34\0\u1d5e\0\u1d88\0\u1db2\0\u1ddc\0\u1e06\0\u1e30"
|
||||
+ "\0\u1e5a\0\u1e84\0\u1eae\0\u1ed8\0\u1f02\0\u1f2c\0\u1b12\0\u1f56"
|
||||
+ "\0\u1f80\0\u1faa\0\u1fd4\0\u1ffe\0\u2028\0\u2052\0\u207c\0\u20a6"
|
||||
+ "\0\u20d0\0\u20fa\0\u2124\0\u214e\0\u2178\0\u21a2\0\u21cc\0\u21f6"
|
||||
+ "\0\u2220\0\u224a\0\u2274\0\u229e\0\u22c8\0\u22f2\0\u231c\0\u2346"
|
||||
+ "\0\u2370\0\u239a\0\u23c4\0\u23ee\0\u2418\0\u2442\0\u246c\0\u2496"
|
||||
+ "\0\u24c0\0\u24ea\0\u2514\0\u253e\0\u2568\0\176\0\u2592\0\u25bc"
|
||||
+ "\0\u25e6\0\u2610\0\u263a\0\u2664\0\u268e\0\u26b8\0\u26e2\0\u270c" + "\0\u13da";
|
||||
|
||||
private static int[] zzUnpackRowMap() {
|
||||
int[] result = new int[257];
|
||||
int offset = 0;
|
||||
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackRowMap(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int high = packed.charAt(i++) << 16;
|
||||
result[j++] = high | packed.charAt(i++);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* The transition table of the DFA
|
||||
*/
|
||||
private static final int[] ZZ_TRANS = zzUnpackTrans();
|
||||
private static final String ZZ_TRANS_PACKED_0 = "\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13"
|
||||
+ "\1\14\1\15\1\16\1\17\1\20\1\17\1\21\1\22" + "\1\23\1\24\1\25\1\12\1\26\1\27\1\30\1\31"
|
||||
+ "\1\32\1\33\1\34\1\35\1\36\1\37\1\40\1\41" + "\2\12\1\42\1\12\1\43\2\12\1\44\2\12\1\45"
|
||||
+ "\1\46\6\45\1\47\41\45\1\50\1\51\7\50\1\52" + "\40\50\54\0\1\6\53\0\1\53\1\0\1\12\1\54"
|
||||
+ "\7\0\1\55\1\56\1\12\1\57\1\12\1\60\1\61" + "\1\62\1\63\1\12\1\64\1\65\1\66\1\54\1\67"
|
||||
+ "\1\70\1\71\12\12\4\0\1\12\1\0\2\12\7\0" + "\33\12\4\0\1\12\1\0\1\12\1\72\7\0\1\73"
|
||||
+ "\2\12\1\74\2\12\1\75\1\76\3\12\1\77\1\12" + "\1\72\1\12\1\100\2\12\1\101\1\12\1\102\6\12"
|
||||
+ "\13\0\1\20\55\0\1\103\1\104\1\103\1\105\1\0" + "\1\106\1\107\1\110\2\0\1\111\24\0\1\12\1\0"
|
||||
+ "\2\12\7\0\1\112\1\12\1\112\1\113\3\12\1\114" + "\23\12\4\0\1\12\1\0\2\12\7\0\6\12\1\115"
|
||||
+ "\1\12\1\116\11\12\1\117\10\12\4\0\1\12\1\0" + "\2\12\7\0\7\12\1\120\23\12\4\0\1\12\1\0"
|
||||
+ "\2\12\7\0\1\121\4\12\1\122\13\12\1\123\11\12" + "\4\0\1\12\1\0\2\12\7\0\7\12\1\124\4\12"
|
||||
+ "\1\125\16\12\4\0\1\12\1\0\1\12\1\72\7\0" + "\1\126\1\127\3\12\1\60\5\12\1\130\1\131\1\72"
|
||||
+ "\1\12\1\132\1\133\12\12\4\0\1\12\1\0\2\12" + "\7\0\16\12\1\117\14\12\4\0\1\12\1\0\2\12"
|
||||
+ "\7\0\3\12\1\134\27\12\4\0\1\12\1\0\2\12" + "\7\0\13\12\1\135\17\12\4\0\1\12\1\0\2\12"
|
||||
+ "\7\0\1\136\6\12\1\137\1\12\1\140\21\12\4\0" + "\1\12\1\0\2\12\7\0\1\12\1\141\1\12\1\142"
|
||||
+ "\1\143\1\144\3\12\1\145\2\12\1\146\16\12\4\0" + "\1\147\1\0\1\12\1\150\7\0\5\12\1\151\1\152"
|
||||
+ "\3\12\1\153\1\154\1\12\1\150\1\12\1\155\13\12" + "\4\0\1\12\1\0\2\12\7\0\6\12\1\156\1\12"
|
||||
+ "\1\157\22\12\4\0\1\12\1\0\2\12\7\0\6\12" + "\1\160\1\161\4\12\1\162\16\12\4\0\1\12\1\0"
|
||||
+ "\2\12\7\0\6\12\1\163\24\12\4\0\1\12\1\0" + "\2\12\7\0\14\12\1\164\16\12\4\0\1\12\1\0"
|
||||
+ "\2\12\7\0\10\12\1\165\11\12\1\166\10\12\4\0" + "\1\12\1\0\2\12\7\0\3\12\1\167\27\12\1\45"
|
||||
+ "\1\0\6\45\1\0\41\45\1\50\1\0\7\50\1\0" + "\40\50\4\0\1\12\1\0\2\12\7\0\14\12\1\170"
|
||||
+ "\16\12\4\0\1\12\1\0\2\12\7\0\7\12\1\171" + "\7\12\1\100\13\12\4\0\1\12\1\0\2\12\7\0"
|
||||
+ "\7\12\1\172\23\12\4\0\1\12\1\0\2\12\7\0" + "\6\12\1\115\24\12\4\0\1\12\1\0\2\12\7\0"
|
||||
+ "\6\12\1\173\3\12\1\174\6\12\1\175\11\12\4\0" + "\1\12\1\0\2\12\7\0\14\12\1\125\16\12\4\0"
|
||||
+ "\1\12\1\0\1\12\1\72\7\0\1\12\1\176\11\12" + "\1\130\1\12\1\72\2\12\1\133\12\12\4\0\1\12"
|
||||
+ "\1\0\2\12\7\0\11\12\1\177\21\12\4\0\1\12" + "\1\0\2\12\7\0\3\12\1\200\27\12\4\0\1\12"
|
||||
+ "\1\0\2\12\7\0\1\201\32\12\4\0\1\12\1\0" + "\2\12\7\0\4\12\1\143\7\12\1\146\16\12\4\0"
|
||||
+ "\1\12\1\0\2\12\7\0\5\12\1\202\11\12\1\203" + "\13\12\4\0\1\12\1\0\2\12\7\0\10\12\1\204"
|
||||
+ "\22\12\4\0\1\12\1\0\2\12\7\0\6\12\1\205" + "\1\206\4\12\1\207\16\12\4\0\1\12\1\0\2\12"
|
||||
+ "\7\0\1\135\32\12\4\0\1\12\1\0\2\12\7\0" + "\7\12\1\133\23\12\4\0\1\12\1\0\2\12\7\0"
|
||||
+ "\7\12\1\210\23\12\4\0\1\12\1\0\2\12\7\0" + "\14\12\1\211\16\12\4\0\1\12\1\0\2\12\7\0"
|
||||
+ "\1\212\12\12\1\135\4\12\1\133\12\12\4\0\1\12" + "\1\0\2\12\7\0\5\12\1\213\5\12\1\214\3\12"
|
||||
+ "\1\215\13\12\4\0\1\12\1\0\2\12\7\0\4\12" + "\1\143\7\12\1\113\16\12\4\0\1\12\1\0\2\12"
|
||||
+ "\7\0\16\12\1\216\14\12\4\0\1\12\1\0\2\12" + "\7\0\6\12\1\217\24\12\4\0\1\12\1\0\1\12"
|
||||
+ "\1\71\7\0\15\12\1\71\15\12\20\0\1\220\1\0" + "\1\220\56\0\1\221\45\0\1\220\50\0\1\220\53\0"
|
||||
+ "\1\222\54\0\1\220\47\0\1\223\30\0\1\12\1\0" + "\2\12\7\0\1\12\1\224\1\12\1\224\27\12\4\0"
|
||||
+ "\1\12\1\0\2\12\7\0\5\12\1\224\25\12\4\0" + "\1\12\1\0\2\12\7\0\2\12\1\225\30\12\4\0"
|
||||
+ "\1\12\1\0\2\12\7\0\5\12\1\214\25\12\4\0" + "\1\12\1\0\2\12\7\0\6\12\1\226\24\12\4\0"
|
||||
+ "\1\12\1\0\2\12\7\0\3\12\1\113\27\12\4\0" + "\1\12\1\0\2\12\7\0\1\12\1\227\31\12\4\0"
|
||||
+ "\1\12\1\0\2\12\7\0\13\12\1\230\17\12\4\0" + "\1\231\1\0\2\12\7\0\33\12\4\0\1\12\1\0"
|
||||
+ "\2\12\7\0\14\12\1\202\1\12\1\232\14\12\4\0" + "\1\12\1\0\2\12\7\0\5\12\1\135\25\12\4\0"
|
||||
+ "\1\12\1\0\2\12\7\0\5\12\1\202\25\12\4\0" + "\1\12\1\0\2\12\7\0\1\233\6\12\1\172\23\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\6\12\1\234\24\12" + "\4\0\1\12\1\0\2\12\7\0\14\12\1\113\16\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\5\12\1\202\11\12" + "\1\235\13\12\4\0\1\12\1\0\2\12\7\0\6\12"
|
||||
+ "\1\236\1\206\4\12\1\237\16\12\4\0\1\12\1\0" + "\2\12\7\0\13\12\1\224\17\12\4\0\1\12\1\0"
|
||||
+ "\2\12\7\0\1\12\1\240\4\12\1\241\16\12\1\42" + "\5\12\4\0\1\12\1\0\2\12\7\0\3\12\1\224"
|
||||
+ "\27\12\4\0\1\12\1\0\2\12\7\0\7\12\1\242" + "\23\12\4\0\1\12\1\0\2\12\7\0\10\12\1\243"
|
||||
+ "\22\12\4\0\1\12\1\0\2\12\7\0\5\12\1\244" + "\25\12\4\0\1\12\1\0\2\12\7\0\7\12\1\175"
|
||||
+ "\23\12\4\0\1\12\1\0\2\12\7\0\1\245\32\12" + "\4\0\1\12\1\0\2\12\7\0\10\12\1\202\22\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\2\12\1\212\30\12" + "\4\0\1\12\1\0\2\12\7\0\20\12\1\246\12\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\2\12\1\113\2\12" + "\1\214\25\12\4\0\1\12\1\0\2\12\7\0\5\12"
|
||||
+ "\1\60\6\12\1\247\16\12\4\0\1\12\1\0\2\12" + "\7\0\22\12\1\250\10\12\4\0\1\251\1\0\1\12"
|
||||
+ "\1\252\7\0\1\12\1\253\2\12\1\254\10\12\1\252" + "\15\12\4\0\1\12\1\0\2\12\7\0\20\12\1\133"
|
||||
+ "\12\12\4\0\1\12\1\0\2\12\7\0\14\12\1\255" + "\16\12\4\0\1\12\1\0\2\12\7\0\14\12\1\256"
|
||||
+ "\16\12\4\0\1\12\1\0\2\12\7\0\6\12\1\257" + "\7\12\1\260\14\12\4\0\1\12\1\0\2\12\7\0"
|
||||
+ "\10\12\1\261\1\32\21\12\4\0\1\12\1\0\2\12" + "\7\0\3\12\1\262\3\12\1\263\4\12\1\125\16\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\21\12\1\264\11\12" + "\4\0\1\265\1\0\2\12\7\0\33\12\4\0\1\12"
|
||||
+ "\1\0\2\12\7\0\5\12\1\264\25\12\4\0\1\12" + "\1\0\1\12\1\266\7\0\15\12\1\266\15\12\4\0"
|
||||
+ "\1\12\1\0\2\12\7\0\5\12\1\206\25\12\4\0" + "\1\12\1\0\2\12\7\0\14\12\1\267\16\12\4\0"
|
||||
+ "\1\12\1\0\2\12\7\0\3\12\1\270\10\12\1\71" + "\16\12\4\0\1\12\1\0\2\12\7\0\21\12\1\202"
|
||||
+ "\11\12\4\0\1\12\1\0\2\12\7\0\17\12\1\224" + "\13\12\4\0\1\12\1\0\2\12\7\0\13\12\1\214"
|
||||
+ "\17\12\4\0\1\12\1\0\2\12\7\0\2\12\1\271" + "\30\12\4\0\1\12\1\0\2\12\7\0\1\272\32\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\6\12\1\273\24\12" + "\4\0\1\12\1\0\2\12\7\0\16\12\1\224\14\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\6\12\1\274\24\12" + "\4\0\1\12\1\0\2\12\7\0\20\12\1\71\12\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\6\12\1\212\24\12" + "\4\0\1\12\1\0\2\12\7\0\7\12\1\275\23\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\1\12\1\224\31\12" + "\4\0\1\12\1\0\2\12\7\0\3\12\1\276\27\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\7\12\1\206\23\12" + "\4\0\1\12\1\0\2\12\7\0\21\12\1\277\11\12"
|
||||
+ "\4\0\1\224\1\0\2\12\7\0\33\12\4\0\1\12" + "\1\0\2\12\7\0\5\12\1\277\25\12\4\0\1\12"
|
||||
+ "\1\0\2\12\7\0\2\12\1\224\10\12\1\135\17\12" + "\4\0\1\12\1\0\2\12\7\0\1\300\32\12\4\0"
|
||||
+ "\1\12\1\0\2\12\7\0\1\224\32\12\4\0\1\12" + "\1\0\2\12\7\0\1\12\1\301\25\12\1\257\3\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\22\12\1\224\10\12" + "\4\0\1\12\1\0\2\12\7\0\16\12\1\302\14\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\1\255\32\12\4\0" + "\1\12\1\0\2\12\7\0\10\12\1\303\22\12\16\0"
|
||||
+ "\1\20\63\0\1\304\25\0\1\220\64\0\1\305\36\0" + "\1\12\1\0\2\12\7\0\14\12\1\306\14\12\1\307"
|
||||
+ "\1\12\4\0\1\12\1\0\2\12\7\0\5\12\1\310" + "\25\12\4\0\1\12\1\0\2\12\7\0\7\12\1\224"
|
||||
+ "\23\12\4\0\1\12\1\0\2\12\7\0\3\12\1\311" + "\27\12\4\0\1\227\1\0\2\12\7\0\12\12\1\312"
|
||||
+ "\1\12\1\313\16\12\4\0\1\12\1\0\2\12\7\0" + "\1\314\32\12\4\0\1\12\1\0\2\12\7\0\7\12"
|
||||
+ "\1\315\23\12\4\0\1\12\1\0\2\12\7\0\5\12" + "\1\316\25\12\4\0\1\12\1\0\2\12\7\0\6\12"
|
||||
+ "\1\257\24\12\4\0\1\12\1\0\2\12\7\0\21\12" + "\1\317\11\12\4\0\1\12\1\0\2\12\7\0\5\12"
|
||||
+ "\1\317\25\12\4\0\1\12\1\0\2\12\7\0\11\12" + "\1\320\21\12\4\0\1\224\1\0\2\12\7\0\1\224"
|
||||
+ "\32\12\4\0\1\12\1\0\2\12\7\0\6\12\1\202" + "\1\321\23\12\4\0\1\12\1\0\2\12\7\0\6\12"
|
||||
+ "\1\322\10\12\1\275\13\12\4\0\1\12\1\0\1\12" + "\1\323\7\0\15\12\1\323\15\12\4\0\1\12\1\0"
|
||||
+ "\2\12\7\0\3\12\1\324\27\12\4\0\1\12\1\0" + "\2\12\7\0\10\12\1\325\22\12\4\0\1\12\1\0"
|
||||
+ "\2\12\7\0\5\12\1\202\11\12\1\224\13\12\4\0" + "\1\12\1\0\2\12\7\0\6\12\1\321\24\12\4\0"
|
||||
+ "\1\12\1\0\2\12\7\0\3\12\1\255\27\12\4\0" + "\1\12\1\0\2\12\7\0\1\326\32\12\4\0\1\12"
|
||||
+ "\1\0\2\12\7\0\3\12\1\327\27\12\4\0\1\12" + "\1\0\2\12\7\0\11\12\1\330\21\12\4\0\1\12"
|
||||
+ "\1\0\2\12\7\0\21\12\1\224\11\12\4\0\1\12" + "\1\0\2\12\7\0\2\12\1\113\30\12\4\0\1\12"
|
||||
+ "\1\0\2\12\7\0\2\12\1\224\30\12\4\0\1\12" + "\1\0\2\12\7\0\6\12\1\331\24\12\4\0\1\12"
|
||||
+ "\1\0\1\12\1\332\7\0\15\12\1\332\15\12\4\0" + "\1\12\1\0\2\12\7\0\2\12\1\333\30\12\4\0"
|
||||
+ "\1\12\1\0\2\12\7\0\26\12\1\224\2\12\1\224" + "\1\12\4\0\1\12\1\0\2\12\7\0\11\12\1\334"
|
||||
+ "\21\12\4\0\1\12\1\0\2\12\7\0\23\12\1\335" + "\7\12\4\0\1\12\1\0\2\12\7\0\1\12\1\135"
|
||||
+ "\31\12\4\0\1\12\1\0\2\12\7\0\10\12\1\135" + "\22\12\4\0\1\12\1\0\2\12\7\0\31\12\1\307"
|
||||
+ "\1\12\4\0\1\12\1\0\2\12\7\0\1\336\32\12" + "\4\0\1\12\1\0\2\12\7\0\11\12\1\337\21\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\6\12\1\202\24\12" + "\4\0\1\12\1\0\2\12\7\0\5\12\1\340\25\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\31\12\1\224\1\12" + "\4\0\1\12\1\0\2\12\7\0\14\12\1\341\16\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\6\12\1\342\5\12" + "\1\343\16\12\4\0\1\12\1\0\2\12\7\0\1\251"
|
||||
+ "\32\12\4\0\1\12\1\0\2\12\7\0\6\12\1\344" + "\24\12\22\0\1\345\61\0\1\304\23\0\1\12\1\0"
|
||||
+ "\1\12\1\200\7\0\15\12\1\200\15\12\4\0\1\12" + "\1\0\2\12\7\0\26\12\1\224\4\12\4\0\1\12"
|
||||
+ "\1\0\2\12\7\0\13\12\1\346\17\12\4\0\1\12" + "\1\0\2\12\7\0\14\12\1\313\10\12\1\347\5\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\14\12\1\71\16\12" + "\4\0\1\12\1\0\2\12\7\0\12\12\1\224\20\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\14\12\1\350\16\12" + "\4\0\1\12\1\0\1\12\1\351\7\0\15\12\1\351"
|
||||
+ "\15\12\4\0\1\12\1\0\2\12\7\0\32\12\1\224" + "\4\0\1\12\1\0\2\12\7\0\10\12\1\113\22\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\10\12\1\224\22\12" + "\4\0\1\12\1\0\2\12\7\0\1\212\32\12\4\0"
|
||||
+ "\1\12\1\0\2\12\7\0\1\12\1\352\31\12\4\0" + "\1\12\1\0\1\12\1\202\7\0\15\12\1\202\15\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\7\12\1\353\23\12" + "\4\0\1\12\1\0\2\12\7\0\11\12\1\354\21\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\2\12\1\355\30\12" + "\4\0\1\12\1\0\2\12\7\0\14\12\1\270\16\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\17\12\1\356\13\12" + "\4\0\1\12\1\0\2\12\7\0\14\12\1\340\16\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\10\12\1\357\22\12" + "\4\0\1\12\1\0\2\12\7\0\1\360\32\12\4\0"
|
||||
+ "\1\12\1\0\2\12\7\0\13\12\1\361\17\12\4\0" + "\1\12\1\0\2\12\7\0\7\12\1\362\23\12\4\0"
|
||||
+ "\1\12\1\0\2\12\7\0\1\202\32\12\4\0\1\12" + "\1\0\2\12\7\0\13\12\1\352\17\12\4\0\1\12"
|
||||
+ "\1\0\2\12\7\0\5\12\1\257\25\12\4\0\1\12" + "\1\0\2\12\7\0\14\12\1\363\16\12\4\0\1\12"
|
||||
+ "\1\0\2\12\7\0\5\12\1\364\25\12\4\0\1\12" + "\1\0\1\12\1\365\7\0\15\12\1\365\15\12\16\0"
|
||||
+ "\1\366\37\0\1\12\1\0\2\12\7\0\12\12\1\355" + "\20\12\4\0\1\12\1\0\2\12\7\0\22\12\1\367"
|
||||
+ "\10\12\4\0\1\12\1\0\1\12\1\370\7\0\15\12" + "\1\370\15\12\4\0\1\12\1\0\2\12\7\0\6\12"
|
||||
+ "\1\371\24\12\4\0\1\12\1\0\2\12\7\0\14\12" + "\1\372\16\12\4\0\1\12\1\0\2\12\7\0\11\12"
|
||||
+ "\1\373\21\12\4\0\1\135\1\0\2\12\7\0\33\12" + "\4\0\1\12\1\0\2\12\7\0\3\12\1\321\27\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\3\12\1\365\27\12" + "\4\0\1\12\1\0\2\12\7\0\6\12\1\170\24\12"
|
||||
+ "\4\0\1\12\1\0\2\12\7\0\3\12\1\224\3\12" + "\1\224\23\12\4\0\1\12\1\0\2\12\7\0\16\12"
|
||||
+ "\1\374\14\12\4\0\1\12\1\0\1\12\1\375\7\0" + "\15\12\1\375\15\12\4\0\1\12\1\0\2\12\7\0"
|
||||
+ "\5\12\1\133\25\12\4\0\1\12\1\0\2\12\7\0" + "\11\12\1\135\21\12\4\0\1\12\1\0\2\12\7\0"
|
||||
+ "\1\12\1\355\31\12\4\0\1\12\1\0\2\12\7\0" + "\3\12\1\270\27\12\4\0\1\12\1\0\2\12\7\0"
|
||||
+ "\14\12\1\202\16\12\4\0\1\12\1\0\2\12\7\0" + "\1\12\1\376\31\12\4\0\1\12\1\0\2\12\7\0"
|
||||
+ "\7\12\1\113\23\12\4\0\1\12\1\0\2\12\7\0" + "\1\12\1\377\31\12\4\0\1\12\1\0\2\12\7\0"
|
||||
+ "\6\12\1\u0100\24\12\4\0\1\12\1\0\2\12\7\0" + "\6\12\1\267\24\12\4\0\1\12\1\0\2\12\7\0"
|
||||
+ "\3\12\1\u0101\2\12\1\177\24\12\4\0\1\12\1\0" + "\2\12\7\0\14\12\1\124\16\12\4\0\1\12\1\0"
|
||||
+ "\1\12\1\135\7\0\15\12\1\135\15\12";
|
||||
|
||||
private static int[] zzUnpackTrans() {
|
||||
int[] result = new int[10038];
|
||||
int offset = 0;
|
||||
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackTrans(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
value--;
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/* error codes */
|
||||
private static final int ZZ_UNKNOWN_ERROR = 0;
|
||||
private static final int ZZ_NO_MATCH = 1;
|
||||
private static final int ZZ_PUSHBACK_2BIG = 2;
|
||||
/* error messages for the codes above */
|
||||
private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input",
|
||||
"Error: pushback value was too large" };
|
||||
/**
|
||||
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
|
||||
*/
|
||||
private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 = "\1\0\2\1\2\11\1\1\1\11\1\1\1\11\2\1"
|
||||
+ "\2\11\2\1\1\11\25\1\2\11\1\1\2\11\30\1" + "\7\0\106\1\4\0\60\1\2\0\37\1\1\0\20\1" + "\1\11\13\1";
|
||||
|
||||
private static int[] zzUnpackAttribute() {
|
||||
int[] result = new int[257];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAttribute(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/** the input device */
|
||||
private java.io.Reader zzReader;
|
||||
/** the current state of the DFA */
|
||||
private int zzState;
|
||||
/** the current lexical state */
|
||||
private int zzLexicalState = YYINITIAL;
|
||||
/**
|
||||
* this buffer contains the current text to be matched and is the source of the
|
||||
* yytext() string
|
||||
*/
|
||||
private char zzBuffer[];
|
||||
/** the textposition at the last accepting state */
|
||||
private int zzMarkedPos;
|
||||
/** the current text position in the buffer */
|
||||
private int zzCurrentPos;
|
||||
/** startRead marks the beginning of the yytext() string in the buffer */
|
||||
private int zzStartRead;
|
||||
/**
|
||||
* endRead marks the last character in the buffer, that has been read from input
|
||||
*/
|
||||
private int zzEndRead;
|
||||
/** zzAtEOF == true <=> the scanner is at the EOF */
|
||||
private boolean zzAtEOF;
|
||||
/* user code: */
|
||||
|
||||
/**
|
||||
* Constructor. We must have this here as there is no default, no-parameter
|
||||
* constructor generated by JFlex.
|
||||
*/
|
||||
public FortranTokenMaker() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos - 1, tokenType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start, end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "!", null };
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated from
|
||||
* <code>text</code>. This method must be implemented by subclasses so they can
|
||||
* correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing the syntax
|
||||
* highlighted text.
|
||||
*/
|
||||
@Override
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = STRING;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.LITERAL_CHAR:
|
||||
state = CHAR;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos >= s.offset + s.count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream. Does not close the old
|
||||
* reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream <b>cannot</b> be
|
||||
* reused (internal buffer is discarded and lost). Lexical state is set to
|
||||
* <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill no longer
|
||||
* "refills" the buffer (since the way we do it, it's always "full" the first
|
||||
* time through, since it points to the segment's array). So, we assign
|
||||
* zzEndRead here.
|
||||
*/
|
||||
// zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner There is also a java.io.InputStream version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
public FortranTokenMaker(java.io.Reader in) {
|
||||
this.zzReader = in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner. There is also java.io.Reader version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Inputstream to read input from.
|
||||
*/
|
||||
public FortranTokenMaker(java.io.InputStream in) {
|
||||
this(new java.io.InputStreamReader(in));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unpacks the compressed character translation table.
|
||||
*
|
||||
* @param packed the packed character translation table
|
||||
* @return the unpacked character translation table
|
||||
*/
|
||||
private static char[] zzUnpackCMap(String packed) {
|
||||
char[] map = new char[0x10000];
|
||||
int i = 0; /* index in packed string */
|
||||
int j = 0; /* index in unpacked array */
|
||||
while (i < 168) {
|
||||
int count = packed.charAt(i++);
|
||||
char value = packed.charAt(i++);
|
||||
do
|
||||
map[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the input stream.
|
||||
*/
|
||||
public final void yyclose() throws java.io.IOException {
|
||||
zzAtEOF = true; /* indicate end of file */
|
||||
zzEndRead = zzStartRead; /* invalidate buffer */
|
||||
if (zzReader != null)
|
||||
zzReader.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current lexical state.
|
||||
*/
|
||||
public final int yystate() {
|
||||
return zzLexicalState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enters a new lexical state
|
||||
*
|
||||
* @param newState the new lexical state
|
||||
*/
|
||||
@Override
|
||||
public final void yybegin(int newState) {
|
||||
zzLexicalState = newState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the text matched by the current regular expression.
|
||||
*/
|
||||
public final String yytext() {
|
||||
return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character at position <tt>pos</tt> from the matched text.
|
||||
*
|
||||
* It is equivalent to yytext().charAt(pos), but faster
|
||||
*
|
||||
* @param pos the position of the character to fetch. A value from 0 to
|
||||
* yylength()-1.
|
||||
*
|
||||
* @return the character at position pos
|
||||
*/
|
||||
public final char yycharat(int pos) {
|
||||
return zzBuffer[zzStartRead + pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the length of the matched text region.
|
||||
*/
|
||||
public final int yylength() {
|
||||
return zzMarkedPos - zzStartRead;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports an error that occured while scanning.
|
||||
*
|
||||
* In a wellformed scanner (no or only correct usage of yypushback(int) and a
|
||||
* match-all fallback rule) this method will only be called with things that
|
||||
* "Can't Possibly Happen". If this method is called, something is seriously
|
||||
* wrong (e.g. a JFlex bug producing a faulty scanner etc.).
|
||||
*
|
||||
* Usual syntax/scanner level error handling should be done in error fallback
|
||||
* rules.
|
||||
*
|
||||
* @param errorCode the code of the errormessage to display
|
||||
*/
|
||||
private void zzScanError(int errorCode) {
|
||||
String message;
|
||||
try {
|
||||
message = ZZ_ERROR_MSG[errorCode];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
|
||||
}
|
||||
throw new Error(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes the specified amount of characters back into the input stream.
|
||||
*
|
||||
* They will be read again by then next call of the scanning method
|
||||
*
|
||||
* @param number the number of characters to be read again. This number must not
|
||||
* be greater than yylength()!
|
||||
*/
|
||||
public void yypushback(int number) {
|
||||
if (number > yylength())
|
||||
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||
zzMarkedPos -= number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resumes scanning until the next regular expression is matched, the end of
|
||||
* input is encountered or an I/O-Error occurs.
|
||||
*
|
||||
* @return the next token
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
|
||||
int zzInput;
|
||||
int zzAction;
|
||||
// cached fields:
|
||||
int zzCurrentPosL;
|
||||
int zzMarkedPosL;
|
||||
int zzEndReadL = zzEndRead;
|
||||
char[] zzBufferL = zzBuffer;
|
||||
char[] zzCMapL = ZZ_CMAP;
|
||||
int[] zzTransL = ZZ_TRANS;
|
||||
int[] zzRowMapL = ZZ_ROWMAP;
|
||||
int[] zzAttrL = ZZ_ATTRIBUTE;
|
||||
while (true) {
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzAction = -1;
|
||||
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
|
||||
zzState = zzLexicalState;
|
||||
zzForAction: {
|
||||
while (true) {
|
||||
if (zzCurrentPosL < zzEndReadL)
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
else if (zzAtEOF) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
// store back cached positions
|
||||
zzCurrentPos = zzCurrentPosL;
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
boolean eof = zzRefill();
|
||||
// get translated positions and possibly new buffer
|
||||
zzCurrentPosL = zzCurrentPos;
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzBufferL = zzBuffer;
|
||||
zzEndReadL = zzEndRead;
|
||||
if (eof) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
}
|
||||
}
|
||||
int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
|
||||
if (zzNext == -1)
|
||||
break zzForAction;
|
||||
zzState = zzNext;
|
||||
int zzAttributes = zzAttrL[zzState];
|
||||
if ((zzAttributes & 1) == 1) {
|
||||
zzAction = zzState;
|
||||
zzMarkedPosL = zzCurrentPosL;
|
||||
if ((zzAttributes & 8) == 8)
|
||||
break zzForAction;
|
||||
}
|
||||
}
|
||||
}
|
||||
// store back cached position
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||
case 15: {
|
||||
addToken(Token.RESERVED_WORD);
|
||||
}
|
||||
case 17:
|
||||
break;
|
||||
case 2: {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
case 18:
|
||||
break;
|
||||
case 4: {
|
||||
addToken(Token.WHITESPACE);
|
||||
}
|
||||
case 19:
|
||||
break;
|
||||
case 11: {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
return firstToken;
|
||||
}
|
||||
case 20:
|
||||
break;
|
||||
case 13: {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_CHAR);
|
||||
return firstToken;
|
||||
}
|
||||
case 21:
|
||||
break;
|
||||
case 10: {
|
||||
addToken(Token.OPERATOR);
|
||||
}
|
||||
case 22:
|
||||
break;
|
||||
case 5: { // Since we change zzStartRead, we have the
|
||||
// unfortunate
|
||||
// side-effect of not being able to use the '^'
|
||||
// operator.
|
||||
// So we must check whether we're really at the
|
||||
// beginning
|
||||
// of the line ourselves...
|
||||
if (zzStartRead == s.offset) {
|
||||
addToken(zzStartRead, zzEndRead, Token.COMMENT_EOL);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
} else {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
}
|
||||
case 23:
|
||||
break;
|
||||
case 16: {
|
||||
addToken(Token.LITERAL_BOOLEAN);
|
||||
}
|
||||
case 24:
|
||||
break;
|
||||
case 8: {
|
||||
start = zzMarkedPos - 1;
|
||||
yybegin(STRING);
|
||||
}
|
||||
case 25:
|
||||
break;
|
||||
case 7: {
|
||||
addToken(zzStartRead, zzEndRead, Token.COMMENT_EOL);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 26:
|
||||
break;
|
||||
case 6: { // Since we change zzStartRead, we have the
|
||||
// unfortunate
|
||||
// side-effect of not being able to use the '^'
|
||||
// operator.
|
||||
// So we must check whether we're really at the
|
||||
// beginning
|
||||
// of the line ourselves...
|
||||
if (zzStartRead == s.offset) {
|
||||
addToken(zzStartRead, zzEndRead, Token.COMMENT_DOCUMENTATION);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
} else {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
}
|
||||
case 27:
|
||||
break;
|
||||
case 9: {
|
||||
start = zzMarkedPos - 1;
|
||||
yybegin(CHAR);
|
||||
}
|
||||
case 28:
|
||||
break;
|
||||
case 14: {
|
||||
yybegin(YYINITIAL);
|
||||
addToken(start, zzStartRead, Token.LITERAL_CHAR);
|
||||
}
|
||||
case 29:
|
||||
break;
|
||||
case 12: {
|
||||
yybegin(YYINITIAL);
|
||||
addToken(start, zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
}
|
||||
case 30:
|
||||
break;
|
||||
case 3: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 31:
|
||||
break;
|
||||
case 1: {
|
||||
}
|
||||
case 32:
|
||||
break;
|
||||
default:
|
||||
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
|
||||
zzAtEOF = true;
|
||||
switch (zzLexicalState) {
|
||||
case STRING: {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
return firstToken;
|
||||
}
|
||||
case 258:
|
||||
break;
|
||||
case YYINITIAL: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 259:
|
||||
break;
|
||||
case CHAR: {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_CHAR);
|
||||
return firstToken;
|
||||
}
|
||||
case 260:
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,930 +0,0 @@
|
||||
/*
|
||||
* 09/28/2007
|
||||
*
|
||||
* GroovyTokenMaker.java - Scanner for the Groovy programming language.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for the Groovy programming language.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>GroovyTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class GroovyTokenMaker
|
||||
%extends AbstractJFlexCTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public GroovyTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "//", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = MULTILINE_STRING_DOUBLE;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.LITERAL_CHAR:
|
||||
state = MULTILINE_STRING_SINGLE;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.COMMENT_MULTILINE:
|
||||
state = MLC;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.COMMENT_DOCUMENTATION:
|
||||
state = DOCCOMMENT;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns whether a regular expression token can follow the specified
|
||||
* token.
|
||||
*
|
||||
* @param t The token to check, which may be <code>null</code>.
|
||||
* @return Whether a regular expression token may follow this one.
|
||||
*/
|
||||
private static final boolean regexCanFollow(Token t) {
|
||||
char ch;
|
||||
return t==null ||
|
||||
//t.isOperator() ||
|
||||
(t.length()==1 && (
|
||||
(ch=t.charAt(0))=='=' ||
|
||||
ch=='(' ||
|
||||
ch==',' ||
|
||||
ch=='?' ||
|
||||
ch==':' ||
|
||||
ch=='['
|
||||
)) ||
|
||||
/* Operators "==", "===", "!=", "!==", etc. */
|
||||
(t.getType()==Token.OPERATOR &&
|
||||
((ch=t.charAt(t.length()-1))=='=' || ch=='~'));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Letter = [A-Za-z]
|
||||
LetterOrUnderscore = ({Letter}|"_")
|
||||
NonzeroDigit = [1-9]
|
||||
BinaryDigit = ([0-1])
|
||||
Digit = ("0"|{NonzeroDigit})
|
||||
HexDigit = ({Digit}|[A-Fa-f])
|
||||
OctalDigit = ([0-7])
|
||||
AnyCharacterButApostropheOrBackSlash = ([^\\'])
|
||||
EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
|
||||
Escape = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
|
||||
NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
|
||||
IdentifierStart = ({LetterOrUnderscore}|"$")
|
||||
IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
|
||||
|
||||
LineTerminator = (\n)
|
||||
WhiteSpace = ([ \t\f])
|
||||
|
||||
CharLiteral = ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})*[\'])
|
||||
UnclosedCharLiteral = ([\'][^\'\n]*)
|
||||
ErrorCharLiteral = ({UnclosedCharLiteral}[\'])
|
||||
|
||||
MLCBegin = "/*"
|
||||
MLCEnd = "*/"
|
||||
DocCommentBegin = "/**"
|
||||
LineCommentBegin = "//"
|
||||
|
||||
DigitOrUnderscore = ({Digit}|[_])
|
||||
DigitsAndUnderscoresEnd = ({DigitOrUnderscore}*{Digit})
|
||||
IntegerHelper = (({NonzeroDigit}{DigitsAndUnderscoresEnd}?)|"0")
|
||||
IntegerLiteral = ({IntegerHelper}[lL]?)
|
||||
|
||||
BinaryDigitOrUnderscore = ({BinaryDigit}|[_])
|
||||
BinaryDigitsAndUnderscores = ({BinaryDigit}({BinaryDigitOrUnderscore}*{BinaryDigit})?)
|
||||
BinaryLiteral = ("0"[bB]{BinaryDigitsAndUnderscores})
|
||||
|
||||
HexDigitOrUnderscore = ({HexDigit}|[_])
|
||||
HexDigitsAndUnderscores = ({HexDigit}({HexDigitOrUnderscore}*{HexDigit})?)
|
||||
OctalDigitOrUnderscore = ({OctalDigit}|[_])
|
||||
OctalDigitsAndUnderscoresEnd= ({OctalDigitOrUnderscore}*{OctalDigit})
|
||||
HexHelper = ("0"(([xX]{HexDigitsAndUnderscores})|({OctalDigitsAndUnderscoresEnd})))
|
||||
HexLiteral = ({HexHelper}[lL]?)
|
||||
|
||||
FloatHelper1 = ([fFdD]?)
|
||||
FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
|
||||
FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
|
||||
FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
|
||||
FloatLiteral3 = ({Digit}+{FloatHelper2})
|
||||
FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
|
||||
|
||||
ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
|
||||
BooleanLiteral = ("true"|"false")
|
||||
Regex = ([~]?"/"([^\*\\/]|\\.)([^/\\]|\\.)*"/")
|
||||
|
||||
Separator = ([\(\)\{\}\[\]])
|
||||
Separator2 = ([\;,.])
|
||||
|
||||
NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
|
||||
AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
|
||||
GroovyOperator = ("=~")
|
||||
Operator = ({NonAssignmentOperator}|{AssignmentOperator}|{GroovyOperator})
|
||||
|
||||
CurrentBlockTag = ("author"|"deprecated"|"exception"|"param"|"return"|"see"|"serial"|"serialData"|"serialField"|"since"|"throws"|"version")
|
||||
ProposedBlockTag = ("category"|"example"|"tutorial"|"index"|"exclude"|"todo"|"internal"|"obsolete"|"threadsafety")
|
||||
BlockTag = ({CurrentBlockTag}|{ProposedBlockTag})
|
||||
InlineTag = ("code"|"docRoot"|"inheritDoc"|"link"|"linkplain"|"literal"|"value")
|
||||
|
||||
Identifier = ({IdentifierStart}{IdentifierPart}*)
|
||||
ErrorIdentifier = ({NonSeparator}+)
|
||||
|
||||
// Variables in strings
|
||||
VariableStart = ([\$])
|
||||
BracedVariable = ({VariableStart}\{[^\}]+\})
|
||||
UnbracedVariable = ({VariableStart}{Identifier})
|
||||
Variable = ({BracedVariable}|{UnbracedVariable})
|
||||
|
||||
Annotation = ("@"{Identifier}?)
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$]|{Letter}|{Digit})
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
%state MLC
|
||||
%state DOCCOMMENT
|
||||
%state EOL_COMMENT
|
||||
%state MULTILINE_STRING_DOUBLE
|
||||
%state MULTILINE_STRING_SINGLE
|
||||
%state STRING_DOUBLE
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
/* Keywords */
|
||||
"abstract" |
|
||||
"break" |
|
||||
"case" |
|
||||
"catch" |
|
||||
"class" |
|
||||
"const" |
|
||||
"continue" |
|
||||
"default" |
|
||||
"do" |
|
||||
"else" |
|
||||
"enum" |
|
||||
"extends" |
|
||||
"final" |
|
||||
"finally" |
|
||||
"for" |
|
||||
"goto" |
|
||||
"if" |
|
||||
"it" |
|
||||
"implements" |
|
||||
"import" |
|
||||
"instanceof" |
|
||||
"interface" |
|
||||
"native" |
|
||||
"new" |
|
||||
"null" |
|
||||
"package" |
|
||||
"private" |
|
||||
"protected" |
|
||||
"public" |
|
||||
"static" |
|
||||
"strictfp" |
|
||||
"super" |
|
||||
"switch" |
|
||||
"synchronized" |
|
||||
"this" |
|
||||
"throw" |
|
||||
"throws" |
|
||||
"transient" |
|
||||
"try" |
|
||||
"void" |
|
||||
"volatile" |
|
||||
"while" { addToken(Token.RESERVED_WORD); }
|
||||
"return" { addToken(Token.RESERVED_WORD_2); }
|
||||
|
||||
/* Groovy keywords */
|
||||
"as" |
|
||||
"assert" |
|
||||
"def" |
|
||||
"mixin" |
|
||||
"property" |
|
||||
"test" |
|
||||
"using" |
|
||||
"in" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
/* Data types. */
|
||||
"boolean" |
|
||||
"byte" |
|
||||
"char" |
|
||||
"double" |
|
||||
"float" |
|
||||
"int" |
|
||||
"long" |
|
||||
"short" { addToken(Token.DATA_TYPE); }
|
||||
|
||||
/* Booleans. */
|
||||
{BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
|
||||
|
||||
/* java.lang classes */
|
||||
"Appendable" |
|
||||
"AutoCloseable" |
|
||||
"CharSequence" |
|
||||
"Cloneable" |
|
||||
"Comparable" |
|
||||
"Iterable" |
|
||||
"Readable" |
|
||||
"Runnable" |
|
||||
"Thread.UncaughtExceptionHandler" |
|
||||
"Boolean" |
|
||||
"Byte" |
|
||||
"Character" |
|
||||
"Character.Subset" |
|
||||
"Character.UnicodeBlock" |
|
||||
"Class" |
|
||||
"ClassLoader" |
|
||||
"ClassValue" |
|
||||
"Compiler" |
|
||||
"Double" |
|
||||
"Enum" |
|
||||
"Float" |
|
||||
"InheritableThreadLocal" |
|
||||
"Integer" |
|
||||
"Long" |
|
||||
"Math" |
|
||||
"Number" |
|
||||
"Object" |
|
||||
"Package" |
|
||||
"Process" |
|
||||
"ProcessBuilder" |
|
||||
"ProcessBuilder.Redirect" |
|
||||
"Runtime" |
|
||||
"RuntimePermission" |
|
||||
"SecurityManager" |
|
||||
"Short" |
|
||||
"StackTraceElement" |
|
||||
"StrictMath" |
|
||||
"String" |
|
||||
"StringBuffer" |
|
||||
"StringBuilder" |
|
||||
"System" |
|
||||
"Thread" |
|
||||
"ThreadGroup" |
|
||||
"ThreadLocal" |
|
||||
"Throwable" |
|
||||
"Void" |
|
||||
"Character.UnicodeScript" |
|
||||
"ProcessBuilder.Redirect.Type" |
|
||||
"Thread.State" |
|
||||
"ArithmeticException" |
|
||||
"ArrayIndexOutOfBoundsException" |
|
||||
"ArrayStoreException" |
|
||||
"ClassCastException" |
|
||||
"ClassNotFoundException" |
|
||||
"CloneNotSupportedException" |
|
||||
"EnumConstantNotPresentException" |
|
||||
"Exception" |
|
||||
"IllegalAccessException" |
|
||||
"IllegalArgumentException" |
|
||||
"IllegalMonitorStateException" |
|
||||
"IllegalStateException" |
|
||||
"IllegalThreadStateException" |
|
||||
"IndexOutOfBoundsException" |
|
||||
"InstantiationException" |
|
||||
"InterruptedException" |
|
||||
"NegativeArraySizeException" |
|
||||
"NoSuchFieldException" |
|
||||
"NoSuchMethodException" |
|
||||
"NullPointerException" |
|
||||
"NumberFormatException" |
|
||||
"RuntimeException" |
|
||||
"SecurityException" |
|
||||
"StringIndexOutOfBoundsException" |
|
||||
"TypeNotPresentException" |
|
||||
"UnsupportedOperationException" |
|
||||
"AbstractMethodError" |
|
||||
"AssertionError" |
|
||||
"BootstrapMethodError" |
|
||||
"ClassCircularityError" |
|
||||
"ClassFormatError" |
|
||||
"Error" |
|
||||
"ExceptionInInitializerError" |
|
||||
"IllegalAccessError" |
|
||||
"IncompatibleClassChangeError" |
|
||||
"InstantiationError" |
|
||||
"InternalError" |
|
||||
"LinkageError" |
|
||||
"NoClassDefFoundError" |
|
||||
"NoSuchFieldError" |
|
||||
"NoSuchMethodError" |
|
||||
"OutOfMemoryError" |
|
||||
"StackOverflowError" |
|
||||
"ThreadDeath" |
|
||||
"UnknownError" |
|
||||
"UnsatisfiedLinkError" |
|
||||
"UnsupportedClassVersionError" |
|
||||
"VerifyError" |
|
||||
"VirtualMachineError" |
|
||||
|
||||
/* java.io classes*/
|
||||
"Closeable" |
|
||||
"DataInput" |
|
||||
"DataOutput" |
|
||||
"Externalizable" |
|
||||
"FileFilter" |
|
||||
"FilenameFilter" |
|
||||
"Flushable" |
|
||||
"ObjectInput" |
|
||||
"ObjectInputValidation" |
|
||||
"ObjectOutput" |
|
||||
"ObjectStreamConstants" |
|
||||
"Serializable" |
|
||||
|
||||
"BufferedInputStream" |
|
||||
"BufferedOutputStream" |
|
||||
"BufferedReader" |
|
||||
"BufferedWriter" |
|
||||
"ByteArrayInputStream" |
|
||||
"ByteArrayOutputStream" |
|
||||
"CharArrayReader" |
|
||||
"CharArrayWriter" |
|
||||
"Console" |
|
||||
"DataInputStream" |
|
||||
"DataOutputStream" |
|
||||
"File" |
|
||||
"FileDescriptor" |
|
||||
"FileInputStream" |
|
||||
"FileOutputStream" |
|
||||
"FilePermission" |
|
||||
"FileReader" |
|
||||
"FileWriter" |
|
||||
"FilterInputStream" |
|
||||
"FilterOutputStream" |
|
||||
"FilterReader" |
|
||||
"FilterWriter" |
|
||||
"InputStream" |
|
||||
"InputStreamReader" |
|
||||
"LineNumberInputStream" |
|
||||
"LineNumberReader" |
|
||||
"ObjectInputStream" |
|
||||
"ObjectInputStream.GetField" |
|
||||
"ObjectOutputStream" |
|
||||
"ObjectOutputStream.PutField" |
|
||||
"ObjectStreamClass" |
|
||||
"ObjectStreamField" |
|
||||
"OutputStream" |
|
||||
"OutputStreamWriter" |
|
||||
"PipedInputStream" |
|
||||
"PipedOutputStream" |
|
||||
"PipedReader" |
|
||||
"PipedWriter" |
|
||||
"PrintStream" |
|
||||
"PrintWriter" |
|
||||
"PushbackInputStream" |
|
||||
"PushbackReader" |
|
||||
"RandomAccessFile" |
|
||||
"Reader" |
|
||||
"SequenceInputStream" |
|
||||
"SerializablePermission" |
|
||||
"StreamTokenizer" |
|
||||
"StringBufferInputStream" |
|
||||
"StringReader" |
|
||||
"StringWriter" |
|
||||
"Writer" |
|
||||
|
||||
"CharConversionException" |
|
||||
"EOFException" |
|
||||
"FileNotFoundException" |
|
||||
"InterruptedIOException" |
|
||||
"InvalidClassException" |
|
||||
"InvalidObjectException" |
|
||||
"IOException" |
|
||||
"NotActiveException" |
|
||||
"NotSerializableException" |
|
||||
"ObjectStreamException" |
|
||||
"OptionalDataException" |
|
||||
"StreamCorruptedException" |
|
||||
"SyncFailedException" |
|
||||
"UncheckedIOException" |
|
||||
"UnsupportedEncodingException" |
|
||||
"UTFDataFormatException" |
|
||||
"WriteAbortedException" |
|
||||
|
||||
"IOError" |
|
||||
|
||||
/* java.util classes */
|
||||
"Collection" |
|
||||
"Comparator" |
|
||||
"Deque" |
|
||||
"Enumeration" |
|
||||
"EventListener" |
|
||||
"Formattable" |
|
||||
"Iterator" |
|
||||
"List" |
|
||||
"ListIterator" |
|
||||
"Map" |
|
||||
"Map.Entry" |
|
||||
"NavigableMap" |
|
||||
"NavigableSet" |
|
||||
"Observer" |
|
||||
"PrimitiveIterator" |
|
||||
"PrimitiveIterator.OfDouble" |
|
||||
"PrimitiveIterator.OfInt" |
|
||||
"PrimitiveIterator.OfLong" |
|
||||
"Queue" |
|
||||
"RandomAccess" |
|
||||
"Set" |
|
||||
"SortedMap" |
|
||||
"SortedSet" |
|
||||
"Spliterator" |
|
||||
"Spliterator.OfDouble" |
|
||||
"Spliterator.OfInt" |
|
||||
"Spliterator.OfLong" |
|
||||
"Spliterator.OfPrimitive" |
|
||||
|
||||
"AbstractCollection" |
|
||||
"AbstractList" |
|
||||
"AbstractMap" |
|
||||
"AbstractMap.SimpleEntry" |
|
||||
"AbstractMap.SimpleImmutableEntry" |
|
||||
"AbstractQueue" |
|
||||
"AbstractSequentialList" |
|
||||
"AbstractSet" |
|
||||
"ArrayDeque" |
|
||||
"ArrayList" |
|
||||
"Arrays" |
|
||||
"Base64" |
|
||||
"Base64.Decoder" |
|
||||
"Base64.Encoder" |
|
||||
"BitSet" |
|
||||
"Calendar" |
|
||||
"Calendar.Builder" |
|
||||
"Collections" |
|
||||
"Currency" |
|
||||
"Date" |
|
||||
"Dictionary" |
|
||||
"DoubleSummaryStatistics" |
|
||||
"EnumMap" |
|
||||
"EnumSet" |
|
||||
"EventListenerProxy" |
|
||||
"EventObject" |
|
||||
"FormattableFlags" |
|
||||
"Formatter" |
|
||||
"GregorianCalendar" |
|
||||
"HashMap" |
|
||||
"HashSet" |
|
||||
"Hashtable" |
|
||||
"IdentityHashMap" |
|
||||
"IntSummaryStatistics" |
|
||||
"LinkedHashMap" |
|
||||
"LinkedHashSet" |
|
||||
"LinkedList" |
|
||||
"ListResourceBundle" |
|
||||
"Locale" |
|
||||
"Locale.Builder" |
|
||||
"Locale.LanguageRange" |
|
||||
"LongSummaryStatistics" |
|
||||
"Objects" |
|
||||
"Observable" |
|
||||
"Optional" |
|
||||
"OptionalDouble" |
|
||||
"OptionalInt" |
|
||||
"OptionalLong" |
|
||||
"PriorityQueue" |
|
||||
"Properties" |
|
||||
"PropertyPermission" |
|
||||
"PropertyResourceBundle" |
|
||||
"Random" |
|
||||
"ResourceBundle" |
|
||||
"ResourceBundle.Control" |
|
||||
"Scanner" |
|
||||
"ServiceLoader" |
|
||||
"SimpleTimeZone" |
|
||||
"Spliterators" |
|
||||
"Spliterators.AbstractDoubleSpliterator" |
|
||||
"Spliterators.AbstractIntSpliterator" |
|
||||
"Spliterators.AbstractLongSpliterator" |
|
||||
"Spliterators.AbstractSpliterator" |
|
||||
"SpliteratorRandom" |
|
||||
"Stack" |
|
||||
"StringJoiner" |
|
||||
"StringTokenizer" |
|
||||
"Timer" |
|
||||
"TimerTask" |
|
||||
"TimeZone" |
|
||||
"TreeMap" |
|
||||
"TreeSet" |
|
||||
"UUID" |
|
||||
"Vector" |
|
||||
"WeakHashMap" |
|
||||
|
||||
"Formatter.BigDecimalLayoutForm" |
|
||||
"Locale.Category" |
|
||||
"Locale.FilteringMode" |
|
||||
|
||||
"ConcurrentModificationException" |
|
||||
"DuplicateFormatFlagsException" |
|
||||
"EmptyStackException" |
|
||||
"FormatFlagsConversionMismatchException" |
|
||||
"FormatterClosedException" |
|
||||
"IllegalFormatCodePointException" |
|
||||
"IllegalFormatConversionException" |
|
||||
"IllegalFormatException" |
|
||||
"IllegalFormatFlagsException" |
|
||||
"IllegalFormatPrecisionException" |
|
||||
"IllegalFormatWidthException" |
|
||||
"IllformedLocaleException" |
|
||||
"InputMismatchException" |
|
||||
"InvalidPropertiesFormatException" |
|
||||
"MissingFormatArgumentException" |
|
||||
"MissingFormatWidthException" |
|
||||
"MissingResourceException" |
|
||||
"NoSuchElementException" |
|
||||
"TooManyListenersException" |
|
||||
"UnknownFormatConversionException" |
|
||||
"UnknownFormatFlagsException" |
|
||||
|
||||
"ServiceConfigurationError" { addToken(Token.FUNCTION); }
|
||||
|
||||
/* Commonly used methods added to Object class */
|
||||
"addShutdownHook" |
|
||||
"any" |
|
||||
"asBoolean" |
|
||||
"asType" |
|
||||
"collect" |
|
||||
"dump" |
|
||||
"each" |
|
||||
"eachWithIndex" |
|
||||
"every" |
|
||||
"find" |
|
||||
"findAll" |
|
||||
"findIndexOf" |
|
||||
"findIndexValues" |
|
||||
"findLastIndexOf" |
|
||||
"getAt" |
|
||||
"getMetaClass" |
|
||||
"getMetaPropertyValues" |
|
||||
"getProperties" |
|
||||
"grep" |
|
||||
"hasProperty" |
|
||||
"identity" |
|
||||
"inject" |
|
||||
"inspect" |
|
||||
"invokeMethod" |
|
||||
"is" |
|
||||
"isCase" |
|
||||
"iterator" |
|
||||
"metaClass" |
|
||||
"print" |
|
||||
"printf" |
|
||||
"println" |
|
||||
"putAt" |
|
||||
"respondsTo" |
|
||||
"setMetaClass" |
|
||||
"sleep" |
|
||||
"split" |
|
||||
"sprintf" |
|
||||
"toString" |
|
||||
"use" |
|
||||
"with" { addToken(Token.FUNCTION); }
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
{WhiteSpace}+ { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* Multiline string literals. */
|
||||
\"\"\" { start = zzMarkedPos-3; yybegin(MULTILINE_STRING_DOUBLE); }
|
||||
\'\'\' { start = zzMarkedPos-3; yybegin(MULTILINE_STRING_SINGLE); }
|
||||
|
||||
|
||||
/* String/Character literals. */
|
||||
{CharLiteral} { addToken(Token.LITERAL_CHAR); }
|
||||
{UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
|
||||
{ErrorCharLiteral} { addToken(Token.ERROR_CHAR); }
|
||||
\" { start = zzMarkedPos-1; yybegin(STRING_DOUBLE); }
|
||||
|
||||
/* Comment literals. */
|
||||
"/**/" { addToken(Token.COMMENT_MULTILINE); }
|
||||
{MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
|
||||
{DocCommentBegin} { start = zzMarkedPos-3; yybegin(DOCCOMMENT); }
|
||||
{LineCommentBegin} { start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
|
||||
|
||||
/* Regular expressions. */
|
||||
{Regex} {
|
||||
boolean highlightedAsRegex = false;
|
||||
if (zzBuffer[zzStartRead]=='~' || firstToken==null) {
|
||||
addToken(Token.REGEX);
|
||||
highlightedAsRegex = true;
|
||||
}
|
||||
else {
|
||||
// If this is *likely* to be a regex, based on
|
||||
// the previous token, highlight it as such.
|
||||
Token t = firstToken.getLastNonCommentNonWhitespaceToken();
|
||||
if (regexCanFollow(t)) {
|
||||
addToken(Token.REGEX);
|
||||
highlightedAsRegex = true;
|
||||
}
|
||||
}
|
||||
// If it doesn't *appear* to be a regex, highlight it as
|
||||
// individual tokens.
|
||||
if (!highlightedAsRegex) {
|
||||
int temp = zzStartRead + 1;
|
||||
addToken(zzStartRead, zzStartRead, Token.OPERATOR);
|
||||
zzStartRead = zzCurrentPos = zzMarkedPos = temp;
|
||||
}
|
||||
}
|
||||
|
||||
/* Annotations. */
|
||||
{Annotation} { addToken(Token.ANNOTATION); }
|
||||
|
||||
/* Separators. */
|
||||
{Separator} { addToken(Token.SEPARATOR); }
|
||||
{Separator2} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
/* Operators. */
|
||||
{Operator} { addToken(Token.OPERATOR); }
|
||||
|
||||
/* Numbers */
|
||||
{IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{BinaryLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
|
||||
{FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
{ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
|
||||
|
||||
{ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters and flag them as bad. */
|
||||
. { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<MLC> {
|
||||
|
||||
[^hwf\n\*]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
{MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
|
||||
\* {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<DOCCOMMENT> {
|
||||
|
||||
[^hwf\@\{\n\<\*]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
|
||||
"@"{BlockTag} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
|
||||
"@" {}
|
||||
"{@"{InlineTag}[^\}]*"}" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
|
||||
"{" {}
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken; }
|
||||
"<"[/]?({Letter}[^\>]*)?">" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.PREPROCESSOR); start = zzMarkedPos; }
|
||||
\< {}
|
||||
{MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION); }
|
||||
\* {}
|
||||
<<EOF>> { yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<EOL_COMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<MULTILINE_STRING_DOUBLE> {
|
||||
[^\"\\\$\n]* {}
|
||||
\\.? { /* Skip escaped chars, handles case: '\"""'. */ }
|
||||
\"\"\" { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
{Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
|
||||
{VariableStart} {}
|
||||
\" {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<MULTILINE_STRING_SINGLE> {
|
||||
[^\'\\\n]* {}
|
||||
\\.? { /* Skip escaped chars, handles case: "\'''". */ }
|
||||
\'\'\' { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.LITERAL_CHAR); }
|
||||
\' {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
|
||||
}
|
||||
|
||||
<STRING_DOUBLE> {
|
||||
[^\n\\\$\"]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
{Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
|
||||
{VariableStart} {}
|
||||
\" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); return firstToken; }
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -1,256 +0,0 @@
|
||||
/*
|
||||
* 10/17/2015
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for hosts files.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>HostsTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class HostsTokenMaker
|
||||
%extends AbstractJFlexTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
/**
|
||||
* Whether or not this is the first token on a line.
|
||||
*/
|
||||
private boolean first;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public HostsTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "#", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public boolean getMarkOccurrencesOfTokenType(int type) {
|
||||
return type == Token.RESERVED_WORD;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
first = true;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = YYINITIAL;
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Identifier = ([^# \t\n]+)
|
||||
Whitespace = ([ \t]+)
|
||||
LineCommentBegin = "#"
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ([A-Za-z0-9_\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$A-Za-z0-9])
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
%state EOL_COMMENT
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
{Identifier} {
|
||||
addToken(first ? Token.RESERVED_WORD : Token.IDENTIFIER);
|
||||
first = false;
|
||||
}
|
||||
{Whitespace} { addToken(Token.WHITESPACE); }
|
||||
{LineCommentBegin} { start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
|
||||
\n |
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
}
|
||||
|
||||
<EOL_COMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
}
|
||||
@@ -1,621 +0,0 @@
|
||||
/* The following code was generated by JFlex 1.4.1 on 10/17/15 12:49 AM */
|
||||
/*
|
||||
* 10/17/2015
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
|
||||
import org.fife.ui.rsyntaxtextarea.Token;
|
||||
import org.fife.ui.rsyntaxtextarea.TokenImpl;
|
||||
|
||||
/**
|
||||
* Scanner for hosts files.
|
||||
* <p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost completely
|
||||
* removed to be competitive with the handwritten lexers (subclasses of
|
||||
* <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around). We can
|
||||
* achieve this because RText always scans exactly 1 line of tokens at a time,
|
||||
* and hands the scanner this line as an array of characters (a Segment really).
|
||||
* Since tokens contain pointers to char arrays instead of Strings holding their
|
||||
* contents, there is no need for allocating new memory for Strings.
|
||||
* <p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.
|
||||
* <p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>HostsTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>. You
|
||||
* should hand-delete the second of each definition (the ones generated by the
|
||||
* lexer), as these generated methods modify the input buffer, which we'll never
|
||||
* have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT be
|
||||
* initialized. This is a needless memory allocation for us since we will be
|
||||
* pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would with
|
||||
* any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
public class HostsTokenMaker extends AbstractJFlexTokenMaker {
|
||||
|
||||
/** This character denotes the end of file */
|
||||
public static final int YYEOF = -1;
|
||||
/** lexical states */
|
||||
public static final int EOL_COMMENT = 1;
|
||||
public static final int YYINITIAL = 0;
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final String ZZ_CMAP_PACKED = "\11\0\1\2\1\1\25\0\1\2\1\4\1\0\1\3\1\6\1\4"
|
||||
+ "\7\4\1\4\1\21\1\5\12\6\1\17\1\4\1\0\1\4\1\0" + "\2\4\32\6\1\4\1\0\1\4\1\0\1\4\1\0\4\6\1\16"
|
||||
+ "\1\13\1\6\1\7\1\14\2\6\1\15\3\6\1\11\2\6\1\12" + "\1\10\2\6\1\20\3\6\3\0\1\4\uff81\0";
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
|
||||
/**
|
||||
* Translates DFA states to action switch labels.
|
||||
*/
|
||||
private static final int[] ZZ_ACTION = zzUnpackAction();
|
||||
private static final String ZZ_ACTION_PACKED_0 = "\2\0\1\1\1\2\1\3\1\4\1\5\1\6\3\5" + "\12\0\1\7\2\0";
|
||||
|
||||
private static int[] zzUnpackAction() {
|
||||
int[] result = new int[24];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAction(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a state to a row index in the transition table
|
||||
*/
|
||||
private static final int[] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\22\0\44\0\66\0\110\0\66\0\132\0\66"
|
||||
+ "\0\154\0\176\0\220\0\242\0\264\0\306\0\330\0\352"
|
||||
+ "\0\374\0\u010e\0\u0120\0\u0132\0\u0144\0\u0156\0\u0168\0\u0156";
|
||||
|
||||
private static int[] zzUnpackRowMap() {
|
||||
int[] result = new int[24];
|
||||
int offset = 0;
|
||||
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackRowMap(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int high = packed.charAt(i++) << 16;
|
||||
result[j++] = high | packed.charAt(i++);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* The transition table of the DFA
|
||||
*/
|
||||
private static final int[] ZZ_TRANS = zzUnpackTrans();
|
||||
private static final String ZZ_TRANS_PACKED_0 = "\1\3\1\4\1\5\1\6\16\3\1\7\1\10\5\7"
|
||||
+ "\1\11\3\7\1\12\4\7\1\13\1\7\1\3\3\0" + "\16\3\24\0\1\5\17\0\1\7\1\0\5\7\1\0"
|
||||
+ "\3\7\1\0\4\7\1\0\1\7\10\0\1\14\21\0" + "\1\15\3\0\1\16\25\0\1\17\11\0\1\20\22\0"
|
||||
+ "\1\21\25\0\1\22\24\0\1\23\12\0\1\24\27\0" + "\1\25\20\0\1\21\24\0\1\26\12\0\1\21\4\0"
|
||||
+ "\1\25\7\0\1\27\17\0\2\30\12\26\1\30\1\26" + "\1\30\5\0\1\26\14\0";
|
||||
|
||||
private static int[] zzUnpackTrans() {
|
||||
int[] result = new int[378];
|
||||
int offset = 0;
|
||||
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackTrans(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
value--;
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/* error codes */
|
||||
private static final int ZZ_UNKNOWN_ERROR = 0;
|
||||
private static final int ZZ_NO_MATCH = 1;
|
||||
private static final int ZZ_PUSHBACK_2BIG = 2;
|
||||
/* error messages for the codes above */
|
||||
private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input",
|
||||
"Error: pushback value was too large" };
|
||||
/**
|
||||
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
|
||||
*/
|
||||
private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 = "\2\0\1\1\1\11\1\1\1\11\1\1\1\11\3\1" + "\12\0\1\1\2\0";
|
||||
|
||||
private static int[] zzUnpackAttribute() {
|
||||
int[] result = new int[24];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAttribute(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/** the input device */
|
||||
private java.io.Reader zzReader;
|
||||
/** the current state of the DFA */
|
||||
private int zzState;
|
||||
/** the current lexical state */
|
||||
private int zzLexicalState = YYINITIAL;
|
||||
/**
|
||||
* this buffer contains the current text to be matched and is the source of the
|
||||
* yytext() string
|
||||
*/
|
||||
private char zzBuffer[];
|
||||
/** the textposition at the last accepting state */
|
||||
private int zzMarkedPos;
|
||||
/** the current text position in the buffer */
|
||||
private int zzCurrentPos;
|
||||
/** startRead marks the beginning of the yytext() string in the buffer */
|
||||
private int zzStartRead;
|
||||
/**
|
||||
* endRead marks the last character in the buffer, that has been read from input
|
||||
*/
|
||||
private int zzEndRead;
|
||||
/** zzAtEOF == true <=> the scanner is at the EOF */
|
||||
private boolean zzAtEOF;
|
||||
/* user code: */
|
||||
/**
|
||||
* Whether or not this is the first token on a line.
|
||||
*/
|
||||
private boolean first;
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a no-parameter
|
||||
* constructor.
|
||||
*/
|
||||
public HostsTokenMaker() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos - 1, tokenType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start, end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "#", null };
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public boolean getMarkOccurrencesOfTokenType(int type) {
|
||||
return type == Token.RESERVED_WORD;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated from
|
||||
* <code>text</code>. This method must be implemented by subclasses so they can
|
||||
* correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing the syntax
|
||||
* highlighted text.
|
||||
*/
|
||||
@Override
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
first = true;
|
||||
// Start off in the proper state.
|
||||
int state = YYINITIAL;
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos >= s.offset + s.count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream. Does not close the old
|
||||
* reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream <b>cannot</b> be
|
||||
* reused (internal buffer is discarded and lost). Lexical state is set to
|
||||
* <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill no longer
|
||||
* "refills" the buffer (since the way we do it, it's always "full" the first
|
||||
* time through, since it points to the segment's array). So, we assign
|
||||
* zzEndRead here.
|
||||
*/
|
||||
// zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner There is also a java.io.InputStream version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
public HostsTokenMaker(java.io.Reader in) {
|
||||
this.zzReader = in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner. There is also java.io.Reader version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Inputstream to read input from.
|
||||
*/
|
||||
public HostsTokenMaker(java.io.InputStream in) {
|
||||
this(new java.io.InputStreamReader(in));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unpacks the compressed character translation table.
|
||||
*
|
||||
* @param packed the packed character translation table
|
||||
* @return the unpacked character translation table
|
||||
*/
|
||||
private static char[] zzUnpackCMap(String packed) {
|
||||
char[] map = new char[0x10000];
|
||||
int i = 0; /* index in packed string */
|
||||
int j = 0; /* index in unpacked array */
|
||||
while (i < 94) {
|
||||
int count = packed.charAt(i++);
|
||||
char value = packed.charAt(i++);
|
||||
do
|
||||
map[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the input stream.
|
||||
*/
|
||||
public final void yyclose() throws java.io.IOException {
|
||||
zzAtEOF = true; /* indicate end of file */
|
||||
zzEndRead = zzStartRead; /* invalidate buffer */
|
||||
if (zzReader != null)
|
||||
zzReader.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current lexical state.
|
||||
*/
|
||||
public final int yystate() {
|
||||
return zzLexicalState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enters a new lexical state
|
||||
*
|
||||
* @param newState the new lexical state
|
||||
*/
|
||||
@Override
|
||||
public final void yybegin(int newState) {
|
||||
zzLexicalState = newState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the text matched by the current regular expression.
|
||||
*/
|
||||
public final String yytext() {
|
||||
return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character at position <tt>pos</tt> from the matched text.
|
||||
*
|
||||
* It is equivalent to yytext().charAt(pos), but faster
|
||||
*
|
||||
* @param pos the position of the character to fetch. A value from 0 to
|
||||
* yylength()-1.
|
||||
*
|
||||
* @return the character at position pos
|
||||
*/
|
||||
public final char yycharat(int pos) {
|
||||
return zzBuffer[zzStartRead + pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the length of the matched text region.
|
||||
*/
|
||||
public final int yylength() {
|
||||
return zzMarkedPos - zzStartRead;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports an error that occured while scanning.
|
||||
*
|
||||
* In a wellformed scanner (no or only correct usage of yypushback(int) and a
|
||||
* match-all fallback rule) this method will only be called with things that
|
||||
* "Can't Possibly Happen". If this method is called, something is seriously
|
||||
* wrong (e.g. a JFlex bug producing a faulty scanner etc.).
|
||||
*
|
||||
* Usual syntax/scanner level error handling should be done in error fallback
|
||||
* rules.
|
||||
*
|
||||
* @param errorCode the code of the errormessage to display
|
||||
*/
|
||||
private void zzScanError(int errorCode) {
|
||||
String message;
|
||||
try {
|
||||
message = ZZ_ERROR_MSG[errorCode];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
|
||||
}
|
||||
throw new Error(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes the specified amount of characters back into the input stream.
|
||||
*
|
||||
* They will be read again by then next call of the scanning method
|
||||
*
|
||||
* @param number the number of characters to be read again. This number must not
|
||||
* be greater than yylength()!
|
||||
*/
|
||||
public void yypushback(int number) {
|
||||
if (number > yylength())
|
||||
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||
zzMarkedPos -= number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resumes scanning until the next regular expression is matched, the end of
|
||||
* input is encountered or an I/O-Error occurs.
|
||||
*
|
||||
* @return the next token
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
|
||||
int zzInput;
|
||||
int zzAction;
|
||||
// cached fields:
|
||||
int zzCurrentPosL;
|
||||
int zzMarkedPosL;
|
||||
int zzEndReadL = zzEndRead;
|
||||
char[] zzBufferL = zzBuffer;
|
||||
char[] zzCMapL = ZZ_CMAP;
|
||||
int[] zzTransL = ZZ_TRANS;
|
||||
int[] zzRowMapL = ZZ_ROWMAP;
|
||||
int[] zzAttrL = ZZ_ATTRIBUTE;
|
||||
while (true) {
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzAction = -1;
|
||||
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
|
||||
zzState = zzLexicalState;
|
||||
zzForAction: {
|
||||
while (true) {
|
||||
if (zzCurrentPosL < zzEndReadL)
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
else if (zzAtEOF) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
// store back cached positions
|
||||
zzCurrentPos = zzCurrentPosL;
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
boolean eof = zzRefill();
|
||||
// get translated positions and possibly new buffer
|
||||
zzCurrentPosL = zzCurrentPos;
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzBufferL = zzBuffer;
|
||||
zzEndReadL = zzEndRead;
|
||||
if (eof) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
}
|
||||
}
|
||||
int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
|
||||
if (zzNext == -1)
|
||||
break zzForAction;
|
||||
zzState = zzNext;
|
||||
int zzAttributes = zzAttrL[zzState];
|
||||
if ((zzAttributes & 1) == 1) {
|
||||
zzAction = zzState;
|
||||
zzMarkedPosL = zzCurrentPosL;
|
||||
if ((zzAttributes & 8) == 8)
|
||||
break zzForAction;
|
||||
}
|
||||
}
|
||||
}
|
||||
// store back cached position
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||
case 2: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 8:
|
||||
break;
|
||||
case 7: {
|
||||
int temp = zzStartRead;
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
|
||||
addHyperlinkToken(temp, zzMarkedPos - 1, Token.COMMENT_EOL);
|
||||
start = zzMarkedPos;
|
||||
}
|
||||
case 9:
|
||||
break;
|
||||
case 4: {
|
||||
start = zzMarkedPos - 1;
|
||||
yybegin(EOL_COMMENT);
|
||||
}
|
||||
case 10:
|
||||
break;
|
||||
case 3: {
|
||||
addToken(Token.WHITESPACE);
|
||||
}
|
||||
case 11:
|
||||
break;
|
||||
case 6: {
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 12:
|
||||
break;
|
||||
case 1: {
|
||||
addToken(first ? Token.RESERVED_WORD : Token.IDENTIFIER);
|
||||
first = false;
|
||||
}
|
||||
case 13:
|
||||
break;
|
||||
case 5: {
|
||||
}
|
||||
case 14:
|
||||
break;
|
||||
default:
|
||||
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
|
||||
zzAtEOF = true;
|
||||
switch (zzLexicalState) {
|
||||
case EOL_COMMENT: {
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 25:
|
||||
break;
|
||||
case YYINITIAL: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 26:
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,500 +0,0 @@
|
||||
/*
|
||||
* 06/30/2013
|
||||
*
|
||||
* HtaccessTokenMaker.java - Token generator for .htaccess files.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for .htaccess files.
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>HtaccessTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.7
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class HtaccessTokenMaker
|
||||
%extends AbstractJFlexTokenMaker
|
||||
%unicode
|
||||
%ignorecase
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
/**
|
||||
* Type specific to HtaccessTokenMaker denoting a line ending with an
|
||||
* unclosed double-quote attribute.
|
||||
*/
|
||||
public static final int INTERNAL_ATTR_DOUBLE = -1;
|
||||
|
||||
|
||||
/**
|
||||
* Type specific to HtaccessTokenMaker denoting a line ending with an
|
||||
* unclosed single-quote attribute.
|
||||
*/
|
||||
public static final int INTERNAL_ATTR_SINGLE = -2;
|
||||
|
||||
|
||||
/**
|
||||
* Token type specific to HtaccessTokenMaker denoting a line ending with an
|
||||
* unclosed XML tag; thus a new line is beginning still inside of the tag.
|
||||
*/
|
||||
public static final int INTERNAL_INTAG = -3;
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public HtaccessTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens as an
|
||||
* "end token;" that is, at <code>zzMarkedPos</code>.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addEndToken(int tokenType) {
|
||||
addToken(zzMarkedPos,zzMarkedPos, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns how to transform a line into a line comment.
|
||||
*
|
||||
* @return The line comment start and end text for .htaccess files.
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "#", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = YYINITIAL;
|
||||
switch (initialTokenType) {
|
||||
case INTERNAL_ATTR_DOUBLE:
|
||||
state = INATTR_DOUBLE;
|
||||
break;
|
||||
case INTERNAL_ATTR_SINGLE:
|
||||
state = INATTR_SINGLE;
|
||||
break;
|
||||
case INTERNAL_INTAG:
|
||||
state = INTAG;
|
||||
break;
|
||||
default:
|
||||
state = YYINITIAL;
|
||||
}
|
||||
|
||||
start = text.offset;
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
NameStartChar = ([\:A-Z_a-z])
|
||||
NameChar = ({NameStartChar}|[\-\.0-9])
|
||||
TagName = ({NameStartChar}{NameChar}*)
|
||||
Whitespace = ([ \t\f]+)
|
||||
Identifier = ([^ \t\n<#]+)
|
||||
InTagIdentifier = ([^ \t\n\"\'=>]+)
|
||||
LineCommentBegin = ("#")
|
||||
|
||||
AnyCharacterButDoubleQuoteOrBackSlash = ([^\\\"\n])
|
||||
Escape = ("\\".)
|
||||
StringLiteral = ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
|
||||
UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
|
||||
ErrorStringLiteral = ({UnclosedStringLiteral}[\"])
|
||||
|
||||
NameStartChar = ([\:A-Z_a-z])
|
||||
NameChar = ({NameStartChar}|[\-\.0-9])
|
||||
TagName = ({NameStartChar}{NameChar}*)
|
||||
DirectiveStart = (("<"[/]?){TagName})
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ([A-Za-z_0-9\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$A-Za-z0-9])
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
%state EOL_COMMENT
|
||||
%state INTAG
|
||||
%state INATTR_DOUBLE
|
||||
%state INATTR_SINGLE
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
{Whitespace} { addToken(Token.WHITESPACE); }
|
||||
{LineCommentBegin} { start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
|
||||
|
||||
"<"{TagName} {
|
||||
int count = yylength();
|
||||
addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
|
||||
addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
|
||||
yybegin(INTAG);
|
||||
}
|
||||
"</"{TagName} {
|
||||
int count = yylength();
|
||||
addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
|
||||
addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
|
||||
yybegin(INTAG);
|
||||
}
|
||||
|
||||
"AcceptPathInfo" |
|
||||
"Action" |
|
||||
"AddAlt" |
|
||||
"AddAltByEncoding" |
|
||||
"AddAltByType" |
|
||||
"AddCharset" |
|
||||
"AddDefaultCharset" |
|
||||
"AddDescription" |
|
||||
"AddEncoding" |
|
||||
"AddHandler" |
|
||||
"AddIcon" |
|
||||
"AddIconByEncoding" |
|
||||
"AddIconByType" |
|
||||
"AddInputFilter" |
|
||||
"AddLanguage" |
|
||||
"AddOutputFilter" |
|
||||
"AddOutputFilterByType" |
|
||||
"AddType" |
|
||||
"Allow" |
|
||||
"Anonymous" |
|
||||
"Anonymous_Authoritative" |
|
||||
"Anonymous_LogEmail" |
|
||||
"Anonymous_MustGiveEmail" |
|
||||
"Anonymous_NoUserID" |
|
||||
"Anonymous_VerifyEmail" |
|
||||
"AuthAuthoritative" |
|
||||
"AuthBasicAuthoritative" |
|
||||
"AuthBasicProvider" |
|
||||
"AuthDBMAuthoritative" |
|
||||
"AuthDBMGroupFile" |
|
||||
"AuthDBMType" |
|
||||
"AuthDBMUserFile" |
|
||||
"AuthDigestAlgorithm" |
|
||||
"AuthDigestDomain" |
|
||||
"AuthDigestFile" |
|
||||
"AuthDigestGroupFile" |
|
||||
"AuthDigestNonceFormat" |
|
||||
"AuthDigestNonceLifetime" |
|
||||
"AuthDigestQop" |
|
||||
"AuthGroupFile" |
|
||||
"AuthLDAPAuthoritative" |
|
||||
"AuthLDAPBindDN" |
|
||||
"AuthLDAPBindPassword" |
|
||||
"AuthLDAPCompareDNOnServer" |
|
||||
"AuthLDAPDereferenceAliases" |
|
||||
"AuthLDAPEnabled" |
|
||||
"AuthLDAPFrontPageHack" |
|
||||
"AuthLDAPGroupAttribute" |
|
||||
"AuthLDAPGroupAttributeIsDN" |
|
||||
"AuthLDAPRemoteUserIsDN" |
|
||||
"AuthLDAPUrl" |
|
||||
"AuthName" |
|
||||
"AuthType" |
|
||||
"AuthUserFile" |
|
||||
"BrowserMatch" |
|
||||
"BrowserMatchNoCase" |
|
||||
"CGIMapExtension" |
|
||||
"CharsetDefault" |
|
||||
"CharsetOptions" |
|
||||
"CharsetSourceEnc" |
|
||||
"CheckSpelling" |
|
||||
"ContentDigest" |
|
||||
"CookieDomain" |
|
||||
"CookieExpires" |
|
||||
"CookieName" |
|
||||
"CookieStyle" |
|
||||
"CookieTracking" |
|
||||
"DefaultIcon" |
|
||||
"DefaultLanguage" |
|
||||
"DefaultType" |
|
||||
"Deny" |
|
||||
"DirectoryIndex" |
|
||||
"DirectorySlash" |
|
||||
"EnableMMAP" |
|
||||
"EnableSendfile" |
|
||||
"ErrorDocument" |
|
||||
"Example" |
|
||||
"ExpiresActive" |
|
||||
"ExpiresByType" |
|
||||
"ExpiresDefault" |
|
||||
"FileETag" |
|
||||
"ForceLanguagePriority" |
|
||||
"ForceType" |
|
||||
"Header" |
|
||||
"HeaderName" |
|
||||
"ImapBase" |
|
||||
"ImapDefault" |
|
||||
"ImapMenu" |
|
||||
"IndexIgnore" |
|
||||
"IndexOptions" |
|
||||
"IndexOrderDefault" |
|
||||
"ISAPIAppendLogToErrors" |
|
||||
"ISAPIAppendLogToQuery" |
|
||||
"ISAPIFakeAsync" |
|
||||
"ISAPILogNotSupported" |
|
||||
"ISAPIReadAheadBuffer" |
|
||||
"LanguagePriority" |
|
||||
"LimitRequestBody" |
|
||||
"LimitXMLRequestBody" |
|
||||
"MetaDir" |
|
||||
"MetaFiles" |
|
||||
"MetaSuffix" |
|
||||
"MultiviewsMatch" |
|
||||
"Options" |
|
||||
"Order" |
|
||||
"PassEnv" |
|
||||
"ReadmeName" |
|
||||
"Redirect" |
|
||||
"RedirectMatch" |
|
||||
"RedirectPermanent" |
|
||||
"RedirectTemp" |
|
||||
"RemoveCharset" |
|
||||
"RemoveEncoding" |
|
||||
"RemoveHandler" |
|
||||
"RemoveInputFilter" |
|
||||
"RemoveLanguage" |
|
||||
"RemoveOutputFilter" |
|
||||
"RemoveType" |
|
||||
"RequestHeader" |
|
||||
"Require" |
|
||||
"RewriteBase" |
|
||||
"RewriteCond" |
|
||||
"RewriteEngine" |
|
||||
"RewriteOptions" |
|
||||
"RewriteRule" |
|
||||
"RLimitCPU" |
|
||||
"RLimitMEM" |
|
||||
"RLimitNPROC" |
|
||||
"Satisfy" |
|
||||
"ScriptInterpreterSource" |
|
||||
"ServerSignature" |
|
||||
"SetEnv" |
|
||||
"SetEnvIf" |
|
||||
"SetEnvIfNoCase" |
|
||||
"SetHandler" |
|
||||
"SetInputFilter" |
|
||||
"SetOutputFilter" |
|
||||
"SSIErrorMsg" |
|
||||
"SSITimeFormat" |
|
||||
"SSLCipherSuite" |
|
||||
"SSLOptions" |
|
||||
"SSLProxyCipherSuite" |
|
||||
"SSLProxyVerify" |
|
||||
"SSLProxyVerifyDepth" |
|
||||
"SSLRequire" |
|
||||
"SSLRequireSSL" |
|
||||
"SSLUserName" |
|
||||
"SSLVerifyClient" |
|
||||
"SSLVerifyDepth" |
|
||||
"UnsetEnv" |
|
||||
"XBitHack" { addToken(Token.FUNCTION); }
|
||||
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
{StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
{UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
{ErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
|
||||
|
||||
. { addToken(Token.IDENTIFIER); }
|
||||
\n |
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
}
|
||||
|
||||
<INTAG> {
|
||||
{InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
|
||||
{Whitespace}+ { addToken(Token.WHITESPACE); }
|
||||
"=" { addToken(Token.OPERATOR); }
|
||||
">" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
|
||||
[\"] { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
|
||||
[\'] { start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, INTERNAL_INTAG); return firstToken; }
|
||||
}
|
||||
|
||||
<INATTR_DOUBLE> {
|
||||
[^\"]* {}
|
||||
[\"] { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
|
||||
}
|
||||
|
||||
<INATTR_SINGLE> {
|
||||
[^\']* {}
|
||||
[\'] { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
|
||||
}
|
||||
|
||||
<EOL_COMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,225 +0,0 @@
|
||||
/*
|
||||
* 11/04/2016
|
||||
*
|
||||
* IniTokenMaker.java - Scanner for .ini files.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* This class splits up text into tokens representing a .ini file.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>IniTokenMaker.java</code> file will
|
||||
* contain two definitions of both <code>zzRefill</code> and
|
||||
* <code>yyreset</code>. You should hand-delete the second of each
|
||||
* definition (the ones generated by the lexer), as these generated
|
||||
* methods modify the input buffer, which we'll never have to do.
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.4
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class IniTokenMaker
|
||||
%extends AbstractJFlexTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public IniTokenMaker() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { ";", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
@Override
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = YYINITIAL;
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Equals = ([=])
|
||||
Identifier = ([^ \t\n#;\[=]*)
|
||||
Whitespace = ([ \t]+)
|
||||
Comment = ([#;].*)
|
||||
Section = ([\[][^\]]*[\]]?)
|
||||
|
||||
%state VALUE
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
{Identifier} { addToken(Token.DATA_TYPE); }
|
||||
{Equals} { start = zzMarkedPos; addToken(Token.OPERATOR); yybegin(VALUE); }
|
||||
{Whitespace} { addToken(Token.WHITESPACE); }
|
||||
{Comment} { addToken(Token.COMMENT_EOL); }
|
||||
{Section} { addToken(Token.PREPROCESSOR); }
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
}
|
||||
|
||||
<VALUE> {
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
{Equals} { start = zzMarkedPos; addToken(Token.OPERATOR); }
|
||||
{Whitespace} { addToken(Token.WHITESPACE); }
|
||||
{Comment} { addToken(Token.COMMENT_EOL); }
|
||||
{Section} { addToken(Token.PREPROCESSOR); }
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
}
|
||||
@@ -1,589 +0,0 @@
|
||||
/* The following code was generated by JFlex 1.4.1 on 11/4/16 11:29 PM */
|
||||
/*
|
||||
* 11/04/2016
|
||||
* IniTokenMaker.java - Scanner for .ini files.
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
|
||||
import org.fife.ui.rsyntaxtextarea.Token;
|
||||
import org.fife.ui.rsyntaxtextarea.TokenImpl;
|
||||
|
||||
/**
|
||||
* This class splits up text into tokens representing a .ini file.
|
||||
* <p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost completely
|
||||
* removed to be competitive with the handwritten lexers (subclasses of
|
||||
* <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around). We can
|
||||
* achieve this because RText always scans exactly 1 line of tokens at a time,
|
||||
* and hands the scanner this line as an array of characters (a Segment really).
|
||||
* Since tokens contain pointers to char arrays instead of Strings holding their
|
||||
* contents, there is no need for allocating new memory for Strings.
|
||||
* <p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.
|
||||
* <p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>IniTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>. You
|
||||
* should hand-delete the second of each definition (the ones generated by the
|
||||
* lexer), as these generated methods modify the input buffer, which we'll never
|
||||
* have to do.
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT be
|
||||
* initialized. This is a needless memory allocation for us since we will be
|
||||
* pointing the array somewhere else anyway.
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would with
|
||||
* any other <code>TokenMaker</code> instance.
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.4
|
||||
*
|
||||
*/
|
||||
public class IniTokenMaker extends AbstractJFlexTokenMaker {
|
||||
|
||||
/** This character denotes the end of file */
|
||||
public static final int YYEOF = -1;
|
||||
/** lexical states */
|
||||
public static final int YYINITIAL = 0;
|
||||
public static final int VALUE = 1;
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final String ZZ_CMAP_PACKED = "\11\0\1\3\1\5\25\0\1\3\2\0\1\4\27\0\1\4\1\0"
|
||||
+ "\1\1\35\0\1\2\1\0\1\6\uffa2\0";
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
|
||||
/**
|
||||
* Translates DFA states to action switch labels.
|
||||
*/
|
||||
private static final int[] ZZ_ACTION = zzUnpackAction();
|
||||
private static final String ZZ_ACTION_PACKED_0 = "\1\1\1\2\1\1\1\3\1\4\1\5\1\6\1\2" + "\1\7\1\4";
|
||||
|
||||
private static int[] zzUnpackAction() {
|
||||
int[] result = new int[10];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAction(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a state to a row index in the transition table
|
||||
*/
|
||||
private static final int[] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\7\0\16\0\25\0\34\0\43\0\52\0\61" + "\0\25\0\25";
|
||||
|
||||
private static int[] zzUnpackRowMap() {
|
||||
int[] result = new int[10];
|
||||
int offset = 0;
|
||||
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackRowMap(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int high = packed.charAt(i++) << 16;
|
||||
result[j++] = high | packed.charAt(i++);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* The transition table of the DFA
|
||||
*/
|
||||
private static final int[] ZZ_TRANS = zzUnpackTrans();
|
||||
private static final String ZZ_TRANS_PACKED_0 = "\1\3\1\4\1\5\1\6\1\7\1\0\1\3\1\10"
|
||||
+ "\1\11\1\5\1\6\1\7\1\0\1\10\1\3\5\0" + "\1\3\7\0\6\5\1\12\3\0\1\6\3\0\5\7" + "\1\0\1\7\1\10\5\0\1\10";
|
||||
|
||||
private static int[] zzUnpackTrans() {
|
||||
int[] result = new int[56];
|
||||
int offset = 0;
|
||||
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackTrans(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
value--;
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/* error codes */
|
||||
private static final int ZZ_UNKNOWN_ERROR = 0;
|
||||
private static final int ZZ_NO_MATCH = 1;
|
||||
private static final int ZZ_PUSHBACK_2BIG = 2;
|
||||
/* error messages for the codes above */
|
||||
private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input",
|
||||
"Error: pushback value was too large" };
|
||||
/**
|
||||
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
|
||||
*/
|
||||
private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 = "\3\1\1\11\4\1\2\11";
|
||||
|
||||
private static int[] zzUnpackAttribute() {
|
||||
int[] result = new int[10];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAttribute(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/** the input device */
|
||||
private java.io.Reader zzReader;
|
||||
/** the current state of the DFA */
|
||||
private int zzState;
|
||||
/** the current lexical state */
|
||||
private int zzLexicalState = YYINITIAL;
|
||||
/**
|
||||
* this buffer contains the current text to be matched and is the source of the
|
||||
* yytext() string
|
||||
*/
|
||||
private char zzBuffer[];
|
||||
/** the textposition at the last accepting state */
|
||||
private int zzMarkedPos;
|
||||
/** the current text position in the buffer */
|
||||
private int zzCurrentPos;
|
||||
/** startRead marks the beginning of the yytext() string in the buffer */
|
||||
private int zzStartRead;
|
||||
/**
|
||||
* endRead marks the last character in the buffer, that has been read from input
|
||||
*/
|
||||
private int zzEndRead;
|
||||
/** zzAtEOF == true <=> the scanner is at the EOF */
|
||||
private boolean zzAtEOF;
|
||||
/* user code: */
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a no-parameter
|
||||
* constructor.
|
||||
*/
|
||||
public IniTokenMaker() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos - 1, tokenType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start, end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { ";", null };
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated from
|
||||
* <code>text</code>. This method must be implemented by subclasses so they can
|
||||
* correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing the syntax
|
||||
* highlighted text.
|
||||
*/
|
||||
@Override
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
// Start off in the proper state.
|
||||
int state = YYINITIAL;
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos >= s.offset + s.count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream. Does not close the old
|
||||
* reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream <b>cannot</b> be
|
||||
* reused (internal buffer is discarded and lost). Lexical state is set to
|
||||
* <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill no longer
|
||||
* "refills" the buffer (since the way we do it, it's always "full" the first
|
||||
* time through, since it points to the segment's array). So, we assign
|
||||
* zzEndRead here.
|
||||
*/
|
||||
// zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner There is also a java.io.InputStream version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
public IniTokenMaker(java.io.Reader in) {
|
||||
this.zzReader = in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner. There is also java.io.Reader version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Inputstream to read input from.
|
||||
*/
|
||||
public IniTokenMaker(java.io.InputStream in) {
|
||||
this(new java.io.InputStreamReader(in));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unpacks the compressed character translation table.
|
||||
*
|
||||
* @param packed the packed character translation table
|
||||
* @return the unpacked character translation table
|
||||
*/
|
||||
private static char[] zzUnpackCMap(String packed) {
|
||||
char[] map = new char[0x10000];
|
||||
int i = 0; /* index in packed string */
|
||||
int j = 0; /* index in unpacked array */
|
||||
while (i < 32) {
|
||||
int count = packed.charAt(i++);
|
||||
char value = packed.charAt(i++);
|
||||
do
|
||||
map[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the input stream.
|
||||
*/
|
||||
public final void yyclose() throws java.io.IOException {
|
||||
zzAtEOF = true; /* indicate end of file */
|
||||
zzEndRead = zzStartRead; /* invalidate buffer */
|
||||
if (zzReader != null)
|
||||
zzReader.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current lexical state.
|
||||
*/
|
||||
public final int yystate() {
|
||||
return zzLexicalState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enters a new lexical state
|
||||
*
|
||||
* @param newState the new lexical state
|
||||
*/
|
||||
@Override
|
||||
public final void yybegin(int newState) {
|
||||
zzLexicalState = newState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the text matched by the current regular expression.
|
||||
*/
|
||||
public final String yytext() {
|
||||
return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character at position <tt>pos</tt> from the matched text.
|
||||
*
|
||||
* It is equivalent to yytext().charAt(pos), but faster
|
||||
*
|
||||
* @param pos the position of the character to fetch. A value from 0 to
|
||||
* yylength()-1.
|
||||
*
|
||||
* @return the character at position pos
|
||||
*/
|
||||
public final char yycharat(int pos) {
|
||||
return zzBuffer[zzStartRead + pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the length of the matched text region.
|
||||
*/
|
||||
public final int yylength() {
|
||||
return zzMarkedPos - zzStartRead;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports an error that occured while scanning.
|
||||
*
|
||||
* In a wellformed scanner (no or only correct usage of yypushback(int) and a
|
||||
* match-all fallback rule) this method will only be called with things that
|
||||
* "Can't Possibly Happen". If this method is called, something is seriously
|
||||
* wrong (e.g. a JFlex bug producing a faulty scanner etc.).
|
||||
*
|
||||
* Usual syntax/scanner level error handling should be done in error fallback
|
||||
* rules.
|
||||
*
|
||||
* @param errorCode the code of the errormessage to display
|
||||
*/
|
||||
private void zzScanError(int errorCode) {
|
||||
String message;
|
||||
try {
|
||||
message = ZZ_ERROR_MSG[errorCode];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
|
||||
}
|
||||
throw new Error(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes the specified amount of characters back into the input stream.
|
||||
*
|
||||
* They will be read again by then next call of the scanning method
|
||||
*
|
||||
* @param number the number of characters to be read again. This number must not
|
||||
* be greater than yylength()!
|
||||
*/
|
||||
public void yypushback(int number) {
|
||||
if (number > yylength())
|
||||
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||
zzMarkedPos -= number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resumes scanning until the next regular expression is matched, the end of
|
||||
* input is encountered or an I/O-Error occurs.
|
||||
*
|
||||
* @return the next token
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
|
||||
int zzInput;
|
||||
int zzAction;
|
||||
// cached fields:
|
||||
int zzCurrentPosL;
|
||||
int zzMarkedPosL;
|
||||
int zzEndReadL = zzEndRead;
|
||||
char[] zzBufferL = zzBuffer;
|
||||
char[] zzCMapL = ZZ_CMAP;
|
||||
int[] zzTransL = ZZ_TRANS;
|
||||
int[] zzRowMapL = ZZ_ROWMAP;
|
||||
int[] zzAttrL = ZZ_ATTRIBUTE;
|
||||
while (true) {
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzAction = -1;
|
||||
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
|
||||
zzState = zzLexicalState;
|
||||
zzForAction: {
|
||||
while (true) {
|
||||
if (zzCurrentPosL < zzEndReadL)
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
else if (zzAtEOF) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
// store back cached positions
|
||||
zzCurrentPos = zzCurrentPosL;
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
boolean eof = zzRefill();
|
||||
// get translated positions and possibly new buffer
|
||||
zzCurrentPosL = zzCurrentPos;
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzBufferL = zzBuffer;
|
||||
zzEndReadL = zzEndRead;
|
||||
if (eof) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
}
|
||||
}
|
||||
int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
|
||||
if (zzNext == -1)
|
||||
break zzForAction;
|
||||
zzState = zzNext;
|
||||
int zzAttributes = zzAttrL[zzState];
|
||||
if ((zzAttributes & 1) == 1) {
|
||||
zzAction = zzState;
|
||||
zzMarkedPosL = zzCurrentPosL;
|
||||
if ((zzAttributes & 8) == 8)
|
||||
break zzForAction;
|
||||
}
|
||||
}
|
||||
}
|
||||
// store back cached position
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||
case 3: {
|
||||
start = zzMarkedPos;
|
||||
addToken(Token.OPERATOR);
|
||||
yybegin(VALUE);
|
||||
}
|
||||
case 8:
|
||||
break;
|
||||
case 2: {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
case 9:
|
||||
break;
|
||||
case 5: {
|
||||
addToken(Token.WHITESPACE);
|
||||
}
|
||||
case 10:
|
||||
break;
|
||||
case 7: {
|
||||
start = zzMarkedPos;
|
||||
addToken(Token.OPERATOR);
|
||||
}
|
||||
case 11:
|
||||
break;
|
||||
case 6: {
|
||||
addToken(Token.COMMENT_EOL);
|
||||
}
|
||||
case 12:
|
||||
break;
|
||||
case 4: {
|
||||
addToken(Token.PREPROCESSOR);
|
||||
}
|
||||
case 13:
|
||||
break;
|
||||
case 1: {
|
||||
addToken(Token.DATA_TYPE);
|
||||
}
|
||||
case 14:
|
||||
break;
|
||||
default:
|
||||
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
|
||||
zzAtEOF = true;
|
||||
switch (zzLexicalState) {
|
||||
case YYINITIAL: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 11:
|
||||
break;
|
||||
case VALUE: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 12:
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -1,990 +0,0 @@
|
||||
/*
|
||||
* 02/05/2012
|
||||
*
|
||||
* JavaScriptTokenMaker.java - Parses a document into JavaScript tokens.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
import java.util.Stack;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for JavaScript files. Its states could be simplified, but are
|
||||
* kept the way they are to keep a degree of similarity (i.e. copy/paste)
|
||||
* between it and HTML/JSP/PHPTokenMaker. This should cause no difference in
|
||||
* performance.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>JavaScriptTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.9
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class JavaScriptTokenMaker
|
||||
%extends AbstractJFlexCTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
/**
|
||||
* Token type specifying we're in a JavaScript multiline comment.
|
||||
*/
|
||||
private static final int INTERNAL_IN_JS_MLC = -8;
|
||||
|
||||
/**
|
||||
* Token type specifying we're in a JavaScript documentation comment.
|
||||
*/
|
||||
private static final int INTERNAL_IN_JS_COMMENT_DOCUMENTATION = -9;
|
||||
|
||||
/**
|
||||
* Token type specifying we're in an invalid multi-line JS string.
|
||||
*/
|
||||
private static final int INTERNAL_IN_JS_STRING_INVALID = -10;
|
||||
|
||||
/**
|
||||
* Token type specifying we're in a valid multi-line JS string.
|
||||
*/
|
||||
private static final int INTERNAL_IN_JS_STRING_VALID = -11;
|
||||
|
||||
/**
|
||||
* Token type specifying we're in an invalid multi-line JS single-quoted string.
|
||||
*/
|
||||
private static final int INTERNAL_IN_JS_CHAR_INVALID = -12;
|
||||
|
||||
/**
|
||||
* Token type specifying we're in a valid multi-line JS single-quoted string.
|
||||
*/
|
||||
private static final int INTERNAL_IN_JS_CHAR_VALID = -13;
|
||||
|
||||
private static final int INTERNAL_E4X = -14;
|
||||
|
||||
private static final int INTERNAL_E4X_INTAG = -15;
|
||||
|
||||
private static final int INTERNAL_E4X_MARKUP_PROCESSING_INSTRUCTION = -16;
|
||||
|
||||
private static final int INTERNAL_IN_E4X_COMMENT = -17;
|
||||
|
||||
private static final int INTERNAL_E4X_DTD = -18;
|
||||
|
||||
private static final int INTERNAL_E4X_DTD_INTERNAL = -19;
|
||||
|
||||
private static final int INTERNAL_E4X_ATTR_SINGLE = -20;
|
||||
|
||||
private static final int INTERNAL_E4X_ATTR_DOUBLE = -21;
|
||||
|
||||
private static final int INTERNAL_E4X_MARKUP_CDATA = -22;
|
||||
|
||||
/**
|
||||
* Token type specifying we're in a valid multi-line template literal.
|
||||
*/
|
||||
private static final int INTERNAL_IN_JS_TEMPLATE_LITERAL_VALID = -23;
|
||||
|
||||
/**
|
||||
* Token type specifying we're in an invalid multi-line template literal.
|
||||
*/
|
||||
private static final int INTERNAL_IN_JS_TEMPLATE_LITERAL_INVALID = -24;
|
||||
|
||||
/**
|
||||
* When in the JS_STRING state, whether the current string is valid.
|
||||
*/
|
||||
private boolean validJSString;
|
||||
|
||||
/**
|
||||
* Whether we're in an internal DTD. Only valid if in an e4x DTD.
|
||||
*/
|
||||
private boolean e4x_inInternalDtd;
|
||||
|
||||
/**
|
||||
* The previous e4x state. Only valid if in an e4x state.
|
||||
*/
|
||||
private int e4x_prevState;
|
||||
|
||||
/**
|
||||
* The version of JavaScript being highlighted.
|
||||
*/
|
||||
private static String jsVersion;
|
||||
|
||||
/**
|
||||
* Whether e4x is being highlighted.
|
||||
*/
|
||||
private static boolean e4xSupported;
|
||||
|
||||
/**
|
||||
* Language state set on JS tokens. Must be 0.
|
||||
*/
|
||||
private static final int LANG_INDEX_DEFAULT = 0;
|
||||
|
||||
/**
|
||||
* Language state set on E4X tokens.
|
||||
*/
|
||||
private static final int LANG_INDEX_E4X = 1;
|
||||
|
||||
private Stack<Boolean> varDepths;
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public JavaScriptTokenMaker() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
static {
|
||||
jsVersion = "1.7"; // Many folks using JS tend to be bleeding edge
|
||||
e4xSupported = true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens as an
|
||||
* "end token;" that is, at <code>zzMarkedPos</code>.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addEndToken(int tokenType) {
|
||||
addToken(zzMarkedPos,zzMarkedPos, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the closest {@link TokenTypes} "standard" token type for a given
|
||||
* "internal" token type (e.g. one whose value is <code>< 0</code>).
|
||||
*/
|
||||
@Override
|
||||
public int getClosestStandardTokenTypeForInternalType(int type) {
|
||||
switch (type) {
|
||||
case INTERNAL_IN_JS_MLC:
|
||||
return TokenTypes.COMMENT_MULTILINE;
|
||||
case INTERNAL_IN_JS_COMMENT_DOCUMENTATION:
|
||||
return TokenTypes.COMMENT_DOCUMENTATION;
|
||||
case INTERNAL_IN_JS_STRING_INVALID:
|
||||
case INTERNAL_IN_JS_STRING_VALID:
|
||||
case INTERNAL_IN_JS_CHAR_INVALID:
|
||||
case INTERNAL_IN_JS_CHAR_VALID:
|
||||
return TokenTypes.LITERAL_STRING_DOUBLE_QUOTE;
|
||||
case INTERNAL_IN_JS_TEMPLATE_LITERAL_VALID:
|
||||
return TokenTypes.LITERAL_BACKQUOTE;
|
||||
case INTERNAL_IN_JS_TEMPLATE_LITERAL_INVALID:
|
||||
return TokenTypes.ERROR_STRING_DOUBLE;
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the JavaScript version being highlighted.
|
||||
*
|
||||
* @return Supported JavaScript version.
|
||||
* @see #isJavaScriptCompatible(String)
|
||||
*/
|
||||
public static String getJavaScriptVersion() {
|
||||
return jsVersion;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "//", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
@Override
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
validJSString = true;
|
||||
e4x_prevState = YYINITIAL;
|
||||
e4x_inInternalDtd = false;
|
||||
int languageIndex = LANG_INDEX_DEFAULT;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = YYINITIAL;
|
||||
switch (initialTokenType) {
|
||||
case INTERNAL_IN_JS_MLC:
|
||||
state = JS_MLC;
|
||||
break;
|
||||
case INTERNAL_IN_JS_COMMENT_DOCUMENTATION:
|
||||
state = JS_DOCCOMMENT;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_IN_JS_STRING_INVALID:
|
||||
state = JS_STRING;
|
||||
validJSString = false;
|
||||
break;
|
||||
case INTERNAL_IN_JS_STRING_VALID:
|
||||
state = JS_STRING;
|
||||
break;
|
||||
case INTERNAL_IN_JS_CHAR_INVALID:
|
||||
state = JS_CHAR;
|
||||
validJSString = false;
|
||||
break;
|
||||
case INTERNAL_IN_JS_CHAR_VALID:
|
||||
state = JS_CHAR;
|
||||
break;
|
||||
case INTERNAL_E4X:
|
||||
state = E4X;
|
||||
languageIndex = LANG_INDEX_E4X;
|
||||
break;
|
||||
case INTERNAL_E4X_INTAG:
|
||||
state = E4X_INTAG;
|
||||
languageIndex = LANG_INDEX_E4X;
|
||||
break;
|
||||
case INTERNAL_E4X_MARKUP_PROCESSING_INSTRUCTION:
|
||||
state = E4X_PI;
|
||||
languageIndex = LANG_INDEX_E4X;
|
||||
break;
|
||||
case INTERNAL_E4X_DTD:
|
||||
state = E4X_DTD;
|
||||
languageIndex = LANG_INDEX_E4X;
|
||||
break;
|
||||
case INTERNAL_E4X_DTD_INTERNAL:
|
||||
state = E4X_DTD;
|
||||
e4x_inInternalDtd = true;
|
||||
languageIndex = LANG_INDEX_E4X;
|
||||
break;
|
||||
case INTERNAL_E4X_ATTR_SINGLE:
|
||||
state = E4X_INATTR_SINGLE;
|
||||
languageIndex = LANG_INDEX_E4X;
|
||||
break;
|
||||
case INTERNAL_E4X_ATTR_DOUBLE:
|
||||
state = E4X_INATTR_DOUBLE;
|
||||
languageIndex = LANG_INDEX_E4X;
|
||||
break;
|
||||
case INTERNAL_E4X_MARKUP_CDATA:
|
||||
state = E4X_CDATA;
|
||||
languageIndex = LANG_INDEX_E4X;
|
||||
break;
|
||||
case INTERNAL_IN_JS_TEMPLATE_LITERAL_VALID:
|
||||
state = JS_TEMPLATE_LITERAL;
|
||||
validJSString = true;
|
||||
break;
|
||||
case INTERNAL_IN_JS_TEMPLATE_LITERAL_INVALID:
|
||||
state = JS_TEMPLATE_LITERAL;
|
||||
validJSString = false;
|
||||
break;
|
||||
default:
|
||||
if (initialTokenType<-1024) { // INTERNAL_IN_E4X_COMMENT - prevState
|
||||
int main = -(-initialTokenType & 0xffffff00);
|
||||
switch (main) {
|
||||
default: // Should never happen
|
||||
case INTERNAL_IN_E4X_COMMENT:
|
||||
state = E4X_COMMENT;
|
||||
break;
|
||||
}
|
||||
e4x_prevState = -initialTokenType&0xff;
|
||||
languageIndex = LANG_INDEX_E4X;
|
||||
}
|
||||
else { // Shouldn't happen
|
||||
state = Token.NULL;
|
||||
}
|
||||
}
|
||||
|
||||
setLanguageIndex(languageIndex);
|
||||
start = text.offset;
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns whether e4x is being highlighted.
|
||||
*
|
||||
* @return Whether e4x is being highlighted.
|
||||
* @see #setE4xSupported(boolean)
|
||||
*/
|
||||
public static boolean isE4xSupported() {
|
||||
return e4xSupported;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns whether features for a specific JS version should be honored
|
||||
* while highlighting.
|
||||
*
|
||||
* @param version JavaScript version required
|
||||
* @return Whether the JavaScript version is the same or greater than
|
||||
* version required.
|
||||
*/
|
||||
public static boolean isJavaScriptCompatible(String version) {
|
||||
return jsVersion.compareTo(version) >= 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets whether e4x should be highlighted. A repaint should be forced on
|
||||
* all <code>RSyntaxTextArea</code>s editing JavaScript if this property
|
||||
* is changed to see the difference.
|
||||
*
|
||||
* @param supported Whether e4x should be highlighted.
|
||||
* @see #isE4xSupported()
|
||||
*/
|
||||
public static void setE4xSupported(boolean supported) {
|
||||
e4xSupported = supported;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the supported JavaScript version because some keywords were
|
||||
* introduced on or after this version.
|
||||
*
|
||||
* @param javaScriptVersion The version of JavaScript to support, such as
|
||||
* "<code>1.5</code>" or "<code>1.6</code>".
|
||||
* @see #isJavaScriptCompatible(String)
|
||||
* @see #getJavaScriptVersion()
|
||||
*/
|
||||
public static void setJavaScriptVersion(String javaScriptVersion) {
|
||||
jsVersion = javaScriptVersion;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Whitespace = ([ \t\f]+)
|
||||
LineTerminator = ([\n])
|
||||
|
||||
Letter = [A-Za-z]
|
||||
NonzeroDigit = [1-9]
|
||||
Digit = ("0"|{NonzeroDigit})
|
||||
HexDigit = ({Digit}|[A-Fa-f])
|
||||
OctalDigit = ([0-7])
|
||||
LetterOrDigit = ({Letter}|{Digit})
|
||||
EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
|
||||
NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\'\`]|"#"|"\\")
|
||||
IdentifierStart = ({Letter}|"_"|"$")
|
||||
IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
|
||||
JS_MLCBegin = "/*"
|
||||
JS_DocCommentBegin = "/**"
|
||||
JS_MLCEnd = "*/"
|
||||
JS_LineCommentBegin = "//"
|
||||
JS_IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
|
||||
JS_IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
|
||||
JS_IntegerLiteral = ({JS_IntegerHelper1}[lL]?)
|
||||
JS_HexLiteral = ({JS_IntegerHelper2}[lL]?)
|
||||
JS_FloatHelper1 = ([fFdD]?)
|
||||
JS_FloatHelper2 = ([eE][+-]?{Digit}+{JS_FloatHelper1})
|
||||
JS_FloatLiteral1 = ({Digit}+"."({JS_FloatHelper1}|{JS_FloatHelper2}|{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2})))
|
||||
JS_FloatLiteral2 = ("."{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2}))
|
||||
JS_FloatLiteral3 = ({Digit}+{JS_FloatHelper2})
|
||||
JS_FloatLiteral = ({JS_FloatLiteral1}|{JS_FloatLiteral2}|{JS_FloatLiteral3}|({Digit}+[fFdD]))
|
||||
JS_ErrorNumberFormat = (({JS_IntegerLiteral}|{JS_HexLiteral}|{JS_FloatLiteral}){NonSeparator}+)
|
||||
JS_Separator = ([\(\)\{\}\[\]\]])
|
||||
JS_Separator2 = ([\;,.])
|
||||
JS_NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"||"|"&&"|">>>")
|
||||
JS_AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
|
||||
JS_Operator = ({JS_NonAssignmentOperator}|{JS_AssignmentOperator})
|
||||
JS_Identifier = ({IdentifierStart}{IdentifierPart}*)
|
||||
JS_ErrorIdentifier = ({NonSeparator}+)
|
||||
JS_Regex = ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[gim]*)
|
||||
JS_E4xAttribute = ("@"{Letter}{LetterOrDigit}*)
|
||||
|
||||
JS_BlockTag = ("abstract"|"access"|"alias"|"augments"|"author"|"borrows"|
|
||||
"callback"|"classdesc"|"constant"|"constructor"|"constructs"|
|
||||
"copyright"|"default"|"deprecated"|"desc"|"enum"|"event"|
|
||||
"example"|"exports"|"external"|"file"|"fires"|"global"|
|
||||
"ignore"|"inner"|"instance"|"kind"|"lends"|"license"|
|
||||
"link"|"member"|"memberof"|"method"|"mixes"|"mixin"|"module"|
|
||||
"name"|"namespace"|"param"|"private"|"property"|"protected"|
|
||||
"public"|"readonly"|"requires"|"return"|"returns"|"see"|"since"|
|
||||
"static"|"summary"|"this"|"throws"|"todo"|
|
||||
"type"|"typedef"|"variation"|"version")
|
||||
JS_InlineTag = ("link"|"linkplain"|"linkcode"|"tutorial")
|
||||
JS_TemplateLiteralExprStart = ("${")
|
||||
|
||||
e4x_NameStartChar = ([\:A-Z_a-z])
|
||||
e4x_NameChar = ({e4x_NameStartChar}|[\-\.0-9])
|
||||
e4x_TagName = ({e4x_NameStartChar}{e4x_NameChar}*)
|
||||
e4x_Identifier = ([^ \t\n<&;]+)
|
||||
e4x_EndXml = ([;])
|
||||
e4x_EntityReference = ([&][^; \t]*[;]?)
|
||||
e4x_InTagIdentifier = ([^ \t\n\"\'=\/>]+)
|
||||
e4x_CDataBegin = ("<![CDATA[")
|
||||
e4x_CDataEnd = ("]]>")
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ({LetterOrDigit}|"_"|[\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$]|{LetterOrDigit})
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
|
||||
%state JS_STRING
|
||||
%state JS_CHAR
|
||||
%state JS_MLC
|
||||
%state JS_DOCCOMMENT
|
||||
%state JS_EOL_COMMENT
|
||||
%state E4X
|
||||
%state E4X_COMMENT
|
||||
%state E4X_PI
|
||||
%state E4X_DTD
|
||||
%state E4X_INTAG
|
||||
%state E4X_INATTR_DOUBLE
|
||||
%state E4X_INATTR_SINGLE
|
||||
%state E4X_CDATA
|
||||
%state JS_TEMPLATE_LITERAL
|
||||
%state JS_TEMPLATE_LITERAL_EXPR
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
// ECMA 3+ keywords.
|
||||
"break" |
|
||||
"continue" |
|
||||
"delete" |
|
||||
"else" |
|
||||
"for" |
|
||||
"function" |
|
||||
"if" |
|
||||
"in" |
|
||||
"new" |
|
||||
"this" |
|
||||
"typeof" |
|
||||
"var" |
|
||||
"void" |
|
||||
"while" |
|
||||
"with" { addToken(Token.RESERVED_WORD); }
|
||||
"return" { addToken(Token.RESERVED_WORD_2); }
|
||||
|
||||
//e4X
|
||||
"each" {if(e4xSupported){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);} }
|
||||
//JavaScript 1.7
|
||||
"let" {if(isJavaScriptCompatible("1.7")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);} }
|
||||
// e4x miscellaneous
|
||||
{JS_E4xAttribute} { addToken(isE4xSupported() ? Token.MARKUP_TAG_ATTRIBUTE : Token.ERROR_IDENTIFIER); }
|
||||
|
||||
// Reserved (but not yet used) ECMA keywords.
|
||||
"abstract" { addToken(Token.RESERVED_WORD); }
|
||||
"boolean" { addToken(Token.DATA_TYPE); }
|
||||
"byte" { addToken(Token.DATA_TYPE); }
|
||||
"case" { addToken(Token.RESERVED_WORD); }
|
||||
"catch" { addToken(Token.RESERVED_WORD); }
|
||||
"char" { addToken(Token.DATA_TYPE); }
|
||||
"class" { addToken(Token.RESERVED_WORD); }
|
||||
"const" { addToken(Token.RESERVED_WORD); }
|
||||
"debugger" { addToken(Token.RESERVED_WORD); }
|
||||
"default" { addToken(Token.RESERVED_WORD); }
|
||||
"do" { addToken(Token.RESERVED_WORD); }
|
||||
"double" { addToken(Token.DATA_TYPE); }
|
||||
"enum" { addToken(Token.RESERVED_WORD); }
|
||||
"export" { addToken(Token.RESERVED_WORD); }
|
||||
"extends" { addToken(Token.RESERVED_WORD); }
|
||||
"final" { addToken(Token.RESERVED_WORD); }
|
||||
"finally" { addToken(Token.RESERVED_WORD); }
|
||||
"float" { addToken(Token.DATA_TYPE); }
|
||||
"goto" { addToken(Token.RESERVED_WORD); }
|
||||
"implements" { addToken(Token.RESERVED_WORD); }
|
||||
"import" { addToken(Token.RESERVED_WORD); }
|
||||
"instanceof" { addToken(Token.RESERVED_WORD); }
|
||||
"int" { addToken(Token.DATA_TYPE); }
|
||||
"interface" { addToken(Token.RESERVED_WORD); }
|
||||
"long" { addToken(Token.DATA_TYPE); }
|
||||
"native" { addToken(Token.RESERVED_WORD); }
|
||||
"package" { addToken(Token.RESERVED_WORD); }
|
||||
"private" { addToken(Token.RESERVED_WORD); }
|
||||
"protected" { addToken(Token.RESERVED_WORD); }
|
||||
"public" { addToken(Token.RESERVED_WORD); }
|
||||
"short" { addToken(Token.DATA_TYPE); }
|
||||
"static" { addToken(Token.RESERVED_WORD); }
|
||||
"super" { addToken(Token.RESERVED_WORD); }
|
||||
"switch" { addToken(Token.RESERVED_WORD); }
|
||||
"synchronized" { addToken(Token.RESERVED_WORD); }
|
||||
"throw" { addToken(Token.RESERVED_WORD); }
|
||||
"throws" { addToken(Token.RESERVED_WORD); }
|
||||
"transient" { addToken(Token.RESERVED_WORD); }
|
||||
"try" { addToken(Token.RESERVED_WORD); }
|
||||
"volatile" { addToken(Token.RESERVED_WORD); }
|
||||
"null" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
// Literals.
|
||||
"false" |
|
||||
"true" { addToken(Token.LITERAL_BOOLEAN); }
|
||||
"NaN" { addToken(Token.RESERVED_WORD); }
|
||||
"Infinity" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
// Functions.
|
||||
"eval" |
|
||||
"parseInt" |
|
||||
"parseFloat" |
|
||||
"escape" |
|
||||
"unescape" |
|
||||
"isNaN" |
|
||||
"isFinite" { addToken(Token.FUNCTION); }
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
{JS_Identifier} { addToken(Token.IDENTIFIER); }
|
||||
{Whitespace} { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* String/Character literals. */
|
||||
[\'] { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR); }
|
||||
[\"] { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING); }
|
||||
[\`] { start = zzMarkedPos-1; validJSString = true; yybegin(JS_TEMPLATE_LITERAL); }
|
||||
|
||||
/* Comment literals. */
|
||||
"/**/" { addToken(Token.COMMENT_MULTILINE); }
|
||||
{JS_MLCBegin} { start = zzMarkedPos-2; yybegin(JS_MLC); }
|
||||
{JS_DocCommentBegin} { start = zzMarkedPos-3; yybegin(JS_DOCCOMMENT); }
|
||||
{JS_LineCommentBegin} { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT); }
|
||||
|
||||
/* Attempt to identify regular expressions (not foolproof) - do after comments! */
|
||||
{JS_Regex} {
|
||||
boolean highlightedAsRegex = false;
|
||||
if (firstToken==null) {
|
||||
addToken(Token.REGEX);
|
||||
highlightedAsRegex = true;
|
||||
}
|
||||
else {
|
||||
// If this is *likely* to be a regex, based on
|
||||
// the previous token, highlight it as such.
|
||||
Token t = firstToken.getLastNonCommentNonWhitespaceToken();
|
||||
if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
|
||||
addToken(Token.REGEX);
|
||||
highlightedAsRegex = true;
|
||||
}
|
||||
}
|
||||
// If it doesn't *appear* to be a regex, highlight it as
|
||||
// individual tokens.
|
||||
if (!highlightedAsRegex) {
|
||||
int temp = zzStartRead + 1;
|
||||
addToken(zzStartRead, zzStartRead, Token.OPERATOR);
|
||||
zzStartRead = zzCurrentPos = zzMarkedPos = temp;
|
||||
}
|
||||
}
|
||||
|
||||
/* Separators. */
|
||||
{JS_Separator} { addToken(Token.SEPARATOR); }
|
||||
{JS_Separator2} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
/* Operators. */
|
||||
[\+]?"="{Whitespace}*"<" {
|
||||
int start = zzStartRead;
|
||||
int operatorLen = yycharat(0)=='+' ? 2 : 1;
|
||||
int yylen = yylength(); // Cache before first addToken() invalidates it
|
||||
//System.out.println("'" + yytext() + "': " + yylength() + ", " + (operatorLen+1));
|
||||
addToken(zzStartRead,zzStartRead+operatorLen-1, Token.OPERATOR);
|
||||
if (yylen>operatorLen+1) {
|
||||
//System.out.println((start+operatorLen) + ", " + (zzMarkedPos-2));
|
||||
addToken(start+operatorLen,zzMarkedPos-2, Token.WHITESPACE);
|
||||
}
|
||||
zzStartRead = zzCurrentPos = zzMarkedPos = zzMarkedPos - 1;
|
||||
if (isE4xSupported()) {
|
||||
// Scanning will continue with "<" as markup tag start
|
||||
yybegin(E4X, LANG_INDEX_E4X);
|
||||
}
|
||||
// Found e4x (or syntax error) but option not enabled;
|
||||
// Scanning will continue at "<" as operator
|
||||
}
|
||||
{JS_Operator} { addToken(Token.OPERATOR); }
|
||||
|
||||
/* Numbers */
|
||||
{JS_IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{JS_HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
|
||||
{JS_FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
{JS_ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
|
||||
|
||||
{JS_ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters and flag them as bad. */
|
||||
. { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
<JS_STRING> {
|
||||
[^\n\\\"]+ {}
|
||||
\\x{HexDigit}{2} {}
|
||||
\\x { /* Invalid latin-1 character \xXX */ validJSString = false; }
|
||||
\\u{HexDigit}{4} {}
|
||||
\\u { /* Invalid Unicode character \\uXXXX */ validJSString = false; }
|
||||
\\. { /* Skip all escaped chars. */ }
|
||||
\\ { /* Line ending in '\' => continue to next line. */
|
||||
if (validJSString) {
|
||||
addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
addEndToken(INTERNAL_IN_JS_STRING_VALID);
|
||||
}
|
||||
else {
|
||||
addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
|
||||
addEndToken(INTERNAL_IN_JS_STRING_INVALID);
|
||||
}
|
||||
return firstToken;
|
||||
}
|
||||
\" { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(YYINITIAL); }
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
}
|
||||
|
||||
<JS_CHAR> {
|
||||
[^\n\\\']+ {}
|
||||
\\x{HexDigit}{2} {}
|
||||
\\x { /* Invalid latin-1 character \xXX */ validJSString = false; }
|
||||
\\u{HexDigit}{4} {}
|
||||
\\u { /* Invalid Unicode character \\uXXXX */ validJSString = false; }
|
||||
\\. { /* Skip all escaped chars. */ }
|
||||
\\ { /* Line ending in '\' => continue to next line. */
|
||||
if (validJSString) {
|
||||
addToken(start,zzStartRead, Token.LITERAL_CHAR);
|
||||
addEndToken(INTERNAL_IN_JS_CHAR_VALID);
|
||||
}
|
||||
else {
|
||||
addToken(start,zzStartRead, Token.ERROR_CHAR);
|
||||
addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
|
||||
}
|
||||
return firstToken;
|
||||
}
|
||||
\' { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(YYINITIAL); }
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addNullToken(); return firstToken; }
|
||||
}
|
||||
|
||||
<JS_TEMPLATE_LITERAL> {
|
||||
[^\n\\\$\`]+ {}
|
||||
\\x{HexDigit}{2} {}
|
||||
\\x { /* Invalid latin-1 character \xXX */ validJSString = false; }
|
||||
\\u{HexDigit}{4} {}
|
||||
\\u { /* Invalid Unicode character \\uXXXX */ validJSString = false; }
|
||||
\\. { /* Skip all escaped chars. */ }
|
||||
|
||||
{JS_TemplateLiteralExprStart} {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_BACKQUOTE);
|
||||
start = zzMarkedPos-2;
|
||||
if (varDepths==null) {
|
||||
varDepths = new Stack<Boolean>();
|
||||
}
|
||||
else {
|
||||
varDepths.clear();
|
||||
}
|
||||
varDepths.push(Boolean.TRUE);
|
||||
yybegin(JS_TEMPLATE_LITERAL_EXPR);
|
||||
}
|
||||
"$" { /* Skip valid '$' that is not part of template literal expression start */ }
|
||||
|
||||
\` { int type = validJSString ? Token.LITERAL_BACKQUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(YYINITIAL); }
|
||||
|
||||
/* Line ending in '\' => continue to next line, though not necessary in template strings. */
|
||||
\\ {
|
||||
if (validJSString) {
|
||||
addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE);
|
||||
addEndToken(INTERNAL_IN_JS_TEMPLATE_LITERAL_VALID);
|
||||
}
|
||||
else {
|
||||
addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
|
||||
addEndToken(INTERNAL_IN_JS_TEMPLATE_LITERAL_INVALID);
|
||||
}
|
||||
return firstToken;
|
||||
}
|
||||
\n |
|
||||
<<EOF>> {
|
||||
if (validJSString) {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_BACKQUOTE);
|
||||
addEndToken(INTERNAL_IN_JS_TEMPLATE_LITERAL_VALID);
|
||||
}
|
||||
else {
|
||||
addToken(start,zzStartRead - 1, Token.ERROR_STRING_DOUBLE);
|
||||
addEndToken(INTERNAL_IN_JS_TEMPLATE_LITERAL_INVALID);
|
||||
}
|
||||
return firstToken;
|
||||
}
|
||||
}
|
||||
|
||||
<JS_TEMPLATE_LITERAL_EXPR> {
|
||||
[^\}\$\n]+ {}
|
||||
"}" {
|
||||
if (!varDepths.empty()) {
|
||||
varDepths.pop();
|
||||
if (varDepths.empty()) {
|
||||
addToken(start,zzStartRead, Token.VARIABLE);
|
||||
start = zzMarkedPos;
|
||||
yybegin(JS_TEMPLATE_LITERAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
{JS_TemplateLiteralExprStart} { varDepths.push(Boolean.TRUE); }
|
||||
"$" {}
|
||||
\n |
|
||||
<<EOF>> {
|
||||
// TODO: This isn't right. The expression and its depth should continue to the next line.
|
||||
addToken(start,zzStartRead-1, Token.VARIABLE); addEndToken(INTERNAL_IN_JS_TEMPLATE_LITERAL_INVALID); return firstToken;
|
||||
}
|
||||
}
|
||||
|
||||
<JS_MLC> {
|
||||
// JavaScript MLC's. This state is essentially Java's MLC state.
|
||||
[^hwf\n\*]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
{JS_MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
|
||||
\* {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
|
||||
}
|
||||
|
||||
<JS_DOCCOMMENT> {
|
||||
[^hwf\@\{\n\<\*]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
|
||||
"@"{JS_BlockTag} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
|
||||
"@" {}
|
||||
"{@"{JS_InlineTag}[^\}]*"}" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
|
||||
"{" {}
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JS_COMMENT_DOCUMENTATION); return firstToken; }
|
||||
"<"[/]?({Letter}[^\>]*)?">" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_MARKUP); start = zzMarkedPos; }
|
||||
\< {}
|
||||
{JS_MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION); }
|
||||
\* {}
|
||||
<<EOF>> { yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JS_COMMENT_DOCUMENTATION); return firstToken; }
|
||||
}
|
||||
|
||||
<JS_EOL_COMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
}
|
||||
|
||||
<E4X> {
|
||||
"<!--" { start = zzStartRead; e4x_prevState = zzLexicalState; yybegin(E4X_COMMENT); }
|
||||
{e4x_CDataBegin} { addToken(Token.MARKUP_CDATA_DELIMITER); start = zzMarkedPos; yybegin(E4X_CDATA); }
|
||||
"<!" { start = zzMarkedPos-2; e4x_inInternalDtd = false; yybegin(E4X_DTD); }
|
||||
"<?" { start = zzMarkedPos-2; yybegin(E4X_PI); }
|
||||
"<"{e4x_TagName} {
|
||||
int count = yylength();
|
||||
addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
|
||||
addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
|
||||
yybegin(E4X_INTAG);
|
||||
}
|
||||
"</"{e4x_TagName} {
|
||||
int count = yylength();
|
||||
addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
|
||||
addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
|
||||
yybegin(E4X_INTAG);
|
||||
}
|
||||
"<" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(E4X_INTAG); }
|
||||
"</" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(E4X_INTAG); }
|
||||
{e4x_Identifier} { addToken(Token.IDENTIFIER); }
|
||||
{e4x_EndXml} { yybegin(YYINITIAL, LANG_INDEX_DEFAULT); addToken(Token.IDENTIFIER); }
|
||||
{e4x_EntityReference} { addToken(Token.MARKUP_ENTITY_REFERENCE); }
|
||||
{Whitespace} { addToken(Token.WHITESPACE); }
|
||||
{LineTerminator} |
|
||||
<<EOF>> { addEndToken(INTERNAL_E4X); return firstToken; }
|
||||
}
|
||||
|
||||
<E4X_COMMENT> {
|
||||
[^hwf\n\-]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
"-->" { int temp = zzMarkedPos; addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); start = temp; yybegin(e4x_prevState); }
|
||||
"-" {}
|
||||
{LineTerminator} |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_E4X_COMMENT - e4x_prevState); return firstToken; }
|
||||
}
|
||||
|
||||
<E4X_PI> {
|
||||
[^\n\?]+ {}
|
||||
"?>" { yybegin(E4X); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION); }
|
||||
"?" {}
|
||||
{LineTerminator} |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); addEndToken(INTERNAL_E4X_MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
|
||||
}
|
||||
|
||||
<E4X_DTD> {
|
||||
[^\n\[\]<>]+ {}
|
||||
"<!--" { int temp = zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_DTD); start = temp; e4x_prevState = zzLexicalState; yybegin(E4X_COMMENT); }
|
||||
"<" {}
|
||||
"[" { e4x_inInternalDtd = true; }
|
||||
"]" { e4x_inInternalDtd = false; }
|
||||
">" { if (!e4x_inInternalDtd) { yybegin(E4X); addToken(start,zzStartRead, Token.MARKUP_DTD); } }
|
||||
{LineTerminator} |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_DTD); addEndToken(e4x_inInternalDtd ? INTERNAL_E4X_DTD_INTERNAL : INTERNAL_E4X_DTD); return firstToken; }
|
||||
}
|
||||
|
||||
<E4X_INTAG> {
|
||||
{e4x_InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
|
||||
{Whitespace} { addToken(Token.WHITESPACE); }
|
||||
"=" { addToken(Token.OPERATOR); }
|
||||
"/" { addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */ }
|
||||
"/>" { yybegin(E4X); addToken(Token.MARKUP_TAG_DELIMITER); }
|
||||
">" { yybegin(E4X); addToken(Token.MARKUP_TAG_DELIMITER); }
|
||||
[\"] { start = zzMarkedPos-1; yybegin(E4X_INATTR_DOUBLE); }
|
||||
[\'] { start = zzMarkedPos-1; yybegin(E4X_INATTR_SINGLE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, INTERNAL_E4X_INTAG); return firstToken; }
|
||||
}
|
||||
|
||||
<E4X_INATTR_DOUBLE> {
|
||||
[^\"]* {}
|
||||
[\"] { yybegin(E4X_INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_E4X_ATTR_DOUBLE); return firstToken; }
|
||||
}
|
||||
|
||||
<E4X_INATTR_SINGLE> {
|
||||
[^\']* {}
|
||||
[\'] { yybegin(E4X_INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_E4X_ATTR_SINGLE); return firstToken; }
|
||||
}
|
||||
|
||||
<E4X_CDATA> {
|
||||
[^\]]+ {}
|
||||
{e4x_CDataEnd} { int temp=zzStartRead; yybegin(E4X); addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addToken(temp,zzMarkedPos-1, Token.MARKUP_CDATA_DELIMITER); }
|
||||
"]" {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addEndToken(INTERNAL_E4X_MARKUP_CDATA); return firstToken; }
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
* 03/15/2015
|
||||
* JshintrcTokenMaker.java - Scanner for .jshintrc files.
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
/**
|
||||
* Scanner for .jshintrc files. This is equivalent to JSON with C-style
|
||||
* end-of-line comments.
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 1.0
|
||||
*/
|
||||
public class JshintrcTokenMaker extends JsonTokenMaker {
|
||||
|
||||
/**
|
||||
* Constructor; overridden to enable highlighting of EOL comments.
|
||||
*/
|
||||
public JshintrcTokenMaker() {
|
||||
setHighlightEolComments(true);
|
||||
}
|
||||
}
|
||||
@@ -1,316 +0,0 @@
|
||||
/*
|
||||
* 12/23/2012
|
||||
*
|
||||
* JsonTokenMaker.java - Scanner for JSON.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for JSON.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>JsonTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.6
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class JsonTokenMaker
|
||||
%extends AbstractJFlexTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
private boolean highlightEolComments;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public JsonTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
* @param hyperlink Whether this token is a hyperlink.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType,
|
||||
int startOffset, boolean hyperlink) {
|
||||
super.addToken(array, start,end, tokenType, startOffset, hyperlink);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns <code>true</code> always as C-style languages use curly braces
|
||||
* to denote code blocks.
|
||||
*
|
||||
* @return <code>true</code> always.
|
||||
*/
|
||||
public boolean getCurlyBracesDenoteCodeBlocks() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean getMarkOccurrencesOfTokenType(int type) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean getShouldIndentNextLineAfter(Token t) {
|
||||
if (t!=null && t.length()==1) {
|
||||
char ch = t.charAt(0);
|
||||
return ch=='{' || ch=='[';
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = YYINITIAL;
|
||||
start = text.offset;
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
protected void setHighlightEolComments(boolean highlightEolComments) {
|
||||
this.highlightEolComments = highlightEolComments;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Whitespace = ([ \t\f]+)
|
||||
Letter = ([A-Za-z])
|
||||
LetterOrUnderscore = ({Letter}|"_")
|
||||
Digit = ([0-9])
|
||||
HexDigit = ({Digit}|[A-Fa-f])
|
||||
IdentifierStart = ([^\" \t\f\[\]\{\}\:,0-9\-/])
|
||||
IdentifierPart = ({IdentifierStart}|{Digit}|[\-])
|
||||
Identifier = ({IdentifierStart}{IdentifierPart}*)
|
||||
|
||||
AnyCharacterButDoubleQuoteOrBackSlash = ([^\\\"\n])
|
||||
EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
|
||||
Escape = ("\\"(([btnfr\"\\/])|{EscapedSourceCharacter}))
|
||||
Key = ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
|
||||
StringLiteral = ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
|
||||
UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
|
||||
ErrorStringLiteral = ({UnclosedStringLiteral}[\"])
|
||||
|
||||
IntegerLiteral = ("-"?{Digit}+)
|
||||
FloatLiteral = ({IntegerLiteral}("."({Digit}+))?([eE][+\-]?{Digit}+)?)
|
||||
|
||||
BooleanLiteral = ("true"|"false")
|
||||
|
||||
Separator = ([\{\}\[\]])
|
||||
Separator2 = ([\:,])
|
||||
|
||||
LineCommentBegin = "//"
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$]|{Letter}|{Digit})
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
%state EOL_COMMENT
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
"null" { addToken(Token.RESERVED_WORD); }
|
||||
{Key}/: { addToken(Token.VARIABLE); }
|
||||
{BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
{Whitespace} { addToken(Token.WHITESPACE); }
|
||||
{StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
{UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
{ErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
|
||||
{Separator} { addToken(Token.SEPARATOR); }
|
||||
{Separator2} { addToken(Token.IDENTIFIER); }
|
||||
{IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
|
||||
{LineCommentBegin} {
|
||||
if (highlightEolComments) {
|
||||
start = zzMarkedPos-2; yybegin(EOL_COMMENT);
|
||||
}
|
||||
else {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
}
|
||||
"/" { addToken(Token.IDENTIFIER); }
|
||||
|
||||
\n |
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters and flag them as identifiers. */
|
||||
. { addToken(Token.IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
<EOL_COMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
}
|
||||
@@ -1,713 +0,0 @@
|
||||
/* The following code was generated by JFlex 1.4.1 on 8/22/15 3:14 PM */
|
||||
/*
|
||||
* 12/23/2012
|
||||
* JsonTokenMaker.java - Scanner for JSON.
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
|
||||
import org.fife.ui.rsyntaxtextarea.Token;
|
||||
import org.fife.ui.rsyntaxtextarea.TokenImpl;
|
||||
|
||||
/**
|
||||
* Scanner for JSON.
|
||||
* <p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost completely
|
||||
* removed to be competitive with the handwritten lexers (subclasses of
|
||||
* <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around). We can
|
||||
* achieve this because RText always scans exactly 1 line of tokens at a time,
|
||||
* and hands the scanner this line as an array of characters (a Segment really).
|
||||
* Since tokens contain pointers to char arrays instead of Strings holding their
|
||||
* contents, there is no need for allocating new memory for Strings.
|
||||
* <p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.
|
||||
* <p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>JsonTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>. You
|
||||
* should hand-delete the second of each definition (the ones generated by the
|
||||
* lexer), as these generated methods modify the input buffer, which we'll never
|
||||
* have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT be
|
||||
* initialized. This is a needless memory allocation for us since we will be
|
||||
* pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would with
|
||||
* any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.6
|
||||
*
|
||||
*/
|
||||
public class JsonTokenMaker extends AbstractJFlexTokenMaker {
|
||||
|
||||
/** This character denotes the end of file */
|
||||
public static final int YYEOF = -1;
|
||||
/** lexical states */
|
||||
public static final int EOL_COMMENT = 1;
|
||||
public static final int YYINITIAL = 0;
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final String ZZ_CMAP_PACKED = "\11\0\1\1\1\10\1\0\1\1\23\0\1\1\1\3\1\11\1\3"
|
||||
+ "\1\2\1\3\5\3\1\21\1\6\1\7\1\17\1\16\12\4\1\32" + "\1\3\1\0\1\3\1\0\2\3\4\5\1\20\1\5\24\2\1\33"
|
||||
+ "\1\13\1\33\1\0\1\3\1\0\1\26\1\15\2\5\1\24\1\25" + "\1\2\1\34\1\36\2\2\1\27\1\2\1\14\1\2\1\35\1\2"
|
||||
+ "\1\23\1\30\1\22\1\12\1\2\1\37\3\2\1\31\1\0\1\31" + "\1\3\uff81\0";
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
|
||||
/**
|
||||
* Translates DFA states to action switch labels.
|
||||
*/
|
||||
private static final int[] ZZ_ACTION = zzUnpackAction();
|
||||
private static final String ZZ_ACTION_PACKED_0 = "\2\0\1\1\1\2\1\3\2\1\1\4\4\1\1\5"
|
||||
+ "\1\6\1\7\3\6\2\0\1\4\1\10\1\4\1\1" + "\1\11\2\1\4\0\2\12\1\0\1\13\1\4\1\14"
|
||||
+ "\1\4\3\1\4\0\1\4\1\15\1\16\2\0\1\17" + "\1\4\2\0\1\4";
|
||||
|
||||
private static int[] zzUnpackAction() {
|
||||
int[] result = new int[55];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAction(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a state to a row index in the transition table
|
||||
*/
|
||||
private static final int[] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\40\0\100\0\140\0\200\0\240\0\300\0\340"
|
||||
+ "\0\u0100\0\u0120\0\u0140\0\u0160\0\240\0\u0180\0\240\0\u01a0"
|
||||
+ "\0\u01c0\0\u01e0\0\u0200\0\u0220\0\u0240\0\u0260\0\u0280\0\u02a0"
|
||||
+ "\0\240\0\u02c0\0\u02e0\0\u0300\0\u0320\0\u0340\0\u0360\0\u0380"
|
||||
+ "\0\u03a0\0\u03a0\0\240\0\u03c0\0\240\0\u03e0\0\u0400\0\u0420"
|
||||
+ "\0\u0440\0\u0460\0\u0480\0\u04a0\0\u04c0\0\u04e0\0\100\0\100"
|
||||
+ "\0\u0500\0\u0520\0\u0540\0\u0560\0\u0580\0\u0540\0\u05a0";
|
||||
|
||||
private static int[] zzUnpackRowMap() {
|
||||
int[] result = new int[55];
|
||||
int offset = 0;
|
||||
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackRowMap(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int high = packed.charAt(i++) << 16;
|
||||
result[j++] = high | packed.charAt(i++);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* The transition table of the DFA
|
||||
*/
|
||||
private static final int[] ZZ_TRANS = zzUnpackTrans();
|
||||
private static final String ZZ_TRANS_PACKED_0 = "\1\3\1\4\2\3\1\5\1\3\1\6\1\7\1\3"
|
||||
+ "\1\10\2\3\1\11\1\3\1\12\3\3\1\13\2\3" + "\1\14\3\3\1\15\1\6\1\15\4\3\10\16\1\17"
|
||||
+ "\14\16\1\20\6\16\1\21\2\16\1\22\1\3\1\0" + "\4\3\1\0\2\3\1\0\4\3\1\0\12\3\3\0"
|
||||
+ "\4\3\1\0\1\4\42\0\1\5\12\0\1\23\1\24" + "\3\0\1\24\57\0\1\5\33\0\10\10\1\25\1\26"
|
||||
+ "\1\10\1\27\24\10\1\3\1\0\4\3\1\0\2\3" + "\1\0\1\30\3\3\1\0\12\3\3\0\4\3\16\0"
|
||||
+ "\1\31\21\0\1\3\1\0\4\3\1\0\2\3\1\0" + "\4\3\1\0\4\3\1\32\5\3\3\0\5\3\1\0"
|
||||
+ "\4\3\1\0\2\3\1\0\4\3\1\0\7\3\1\33" + "\2\3\3\0\4\3\10\16\1\0\14\16\1\0\6\16"
|
||||
+ "\1\0\2\16\23\0\1\34\13\0\1\35\23\0\1\36" + "\54\0\1\37\4\0\1\40\37\0\1\41\2\0\1\42"
|
||||
+ "\11\0\1\42\16\0\11\25\1\43\1\25\1\44\24\25" + "\32\0\1\45\5\0\10\25\1\0\1\10\1\46\4\10"
|
||||
+ "\3\25\2\10\1\25\1\10\12\25\1\3\1\0\4\3" + "\1\0\2\3\1\0\4\3\1\0\10\3\1\47\1\3"
|
||||
+ "\3\0\5\3\1\0\4\3\1\0\2\3\1\0\1\50" + "\3\3\1\0\12\3\3\0\5\3\1\0\4\3\1\0"
|
||||
+ "\2\3\1\0\4\3\1\0\10\3\1\51\1\3\3\0" + "\4\3\35\0\1\52\31\0\1\53\32\0\1\54\54\0"
|
||||
+ "\1\55\4\0\1\40\13\0\1\24\3\0\1\24\17\0" + "\1\41\33\0\10\25\1\0\33\25\2\56\3\25\1\43"
|
||||
+ "\1\25\1\44\1\25\1\56\2\25\1\56\3\25\3\56" + "\11\25\1\3\1\0\4\3\1\0\2\3\1\0\4\3"
|
||||
+ "\1\0\10\3\1\57\1\3\3\0\5\3\1\0\4\3" + "\1\0\2\3\1\0\4\3\1\0\5\3\1\60\4\3"
|
||||
+ "\3\0\5\3\1\0\4\3\1\0\2\3\1\0\4\3" + "\1\0\11\3\1\50\3\0\4\3\32\0\1\61\31\0"
|
||||
+ "\1\52\50\0\1\62\21\0\1\63\20\0\4\25\2\64" + "\3\25\1\43\1\25\1\44\1\25\1\64\2\25\1\64"
|
||||
+ "\3\25\3\64\11\25\16\0\1\65\51\0\1\52\1\0" + "\1\61\7\0\1\63\1\66\2\63\2\66\2\0\1\63"
|
||||
+ "\1\0\3\63\1\66\1\63\1\66\7\63\1\0\2\66" + "\4\63\4\25\2\67\3\25\1\43\1\25\1\44\1\25"
|
||||
+ "\1\67\2\25\1\67\3\25\3\67\11\25\16\0\1\63" + "\21\0\4\25\2\10\3\25\1\43\1\25\1\44\1\25"
|
||||
+ "\1\10\2\25\1\10\3\25\3\10\11\25";
|
||||
|
||||
private static int[] zzUnpackTrans() {
|
||||
int[] result = new int[1472];
|
||||
int offset = 0;
|
||||
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackTrans(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
value--;
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/* error codes */
|
||||
private static final int ZZ_UNKNOWN_ERROR = 0;
|
||||
private static final int ZZ_NO_MATCH = 1;
|
||||
private static final int ZZ_PUSHBACK_2BIG = 2;
|
||||
/* error messages for the codes above */
|
||||
private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input",
|
||||
"Error: pushback value was too large" };
|
||||
/**
|
||||
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
|
||||
*/
|
||||
private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 = "\2\0\3\1\1\11\6\1\1\11\1\1\1\11\3\1"
|
||||
+ "\2\0\1\1\1\3\2\1\1\11\2\1\4\0\2\1" + "\1\0\1\11\1\1\1\15\4\1\4\0\3\1\2\0" + "\2\1\2\0\1\1";
|
||||
|
||||
private static int[] zzUnpackAttribute() {
|
||||
int[] result = new int[55];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAttribute(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/** the input device */
|
||||
private java.io.Reader zzReader;
|
||||
/** the current state of the DFA */
|
||||
private int zzState;
|
||||
/** the current lexical state */
|
||||
private int zzLexicalState = YYINITIAL;
|
||||
/**
|
||||
* this buffer contains the current text to be matched and is the source of the
|
||||
* yytext() string
|
||||
*/
|
||||
private char zzBuffer[];
|
||||
/** the textposition at the last accepting state */
|
||||
private int zzMarkedPos;
|
||||
/** the textposition at the last state to be included in yytext */
|
||||
private int zzPushbackPos;
|
||||
/** the current text position in the buffer */
|
||||
private int zzCurrentPos;
|
||||
/** startRead marks the beginning of the yytext() string in the buffer */
|
||||
private int zzStartRead;
|
||||
/**
|
||||
* endRead marks the last character in the buffer, that has been read from input
|
||||
*/
|
||||
private int zzEndRead;
|
||||
/** zzAtEOF == true <=> the scanner is at the EOF */
|
||||
private boolean zzAtEOF;
|
||||
/* user code: */
|
||||
private boolean highlightEolComments;
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a no-parameter
|
||||
* constructor.
|
||||
*/
|
||||
public JsonTokenMaker() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos - 1, tokenType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token occurs.
|
||||
* @param hyperlink Whether this token is a hyperlink.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset, boolean hyperlink) {
|
||||
super.addToken(array, start, end, tokenType, startOffset, hyperlink);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>true</code> always as C-style languages use curly braces to
|
||||
* denote code blocks.
|
||||
*
|
||||
* @return <code>true</code> always.
|
||||
*/
|
||||
public boolean getCurlyBracesDenoteCodeBlocks() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getMarkOccurrencesOfTokenType(int type) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getShouldIndentNextLineAfter(Token t) {
|
||||
if (t != null && t.length() == 1) {
|
||||
char ch = t.charAt(0);
|
||||
return ch == '{' || ch == '[';
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated from
|
||||
* <code>text</code>. This method must be implemented by subclasses so they can
|
||||
* correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing the syntax
|
||||
* highlighted text.
|
||||
*/
|
||||
@Override
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
// Start off in the proper state.
|
||||
int state = YYINITIAL;
|
||||
start = text.offset;
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
}
|
||||
|
||||
protected void setHighlightEolComments(boolean highlightEolComments) {
|
||||
this.highlightEolComments = highlightEolComments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos >= s.offset + s.count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream. Does not close the old
|
||||
* reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream <b>cannot</b> be
|
||||
* reused (internal buffer is discarded and lost). Lexical state is set to
|
||||
* <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill no longer
|
||||
* "refills" the buffer (since the way we do it, it's always "full" the first
|
||||
* time through, since it points to the segment's array). So, we assign
|
||||
* zzEndRead here.
|
||||
*/
|
||||
// zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner There is also a java.io.InputStream version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
public JsonTokenMaker(java.io.Reader in) {
|
||||
this.zzReader = in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner. There is also java.io.Reader version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Inputstream to read input from.
|
||||
*/
|
||||
public JsonTokenMaker(java.io.InputStream in) {
|
||||
this(new java.io.InputStreamReader(in));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unpacks the compressed character translation table.
|
||||
*
|
||||
* @param packed the packed character translation table
|
||||
* @return the unpacked character translation table
|
||||
*/
|
||||
private static char[] zzUnpackCMap(String packed) {
|
||||
char[] map = new char[0x10000];
|
||||
int i = 0; /* index in packed string */
|
||||
int j = 0; /* index in unpacked array */
|
||||
while (i < 124) {
|
||||
int count = packed.charAt(i++);
|
||||
char value = packed.charAt(i++);
|
||||
do
|
||||
map[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the input stream.
|
||||
*/
|
||||
public final void yyclose() throws java.io.IOException {
|
||||
zzAtEOF = true; /* indicate end of file */
|
||||
zzEndRead = zzStartRead; /* invalidate buffer */
|
||||
if (zzReader != null)
|
||||
zzReader.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current lexical state.
|
||||
*/
|
||||
public final int yystate() {
|
||||
return zzLexicalState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enters a new lexical state
|
||||
*
|
||||
* @param newState the new lexical state
|
||||
*/
|
||||
@Override
|
||||
public final void yybegin(int newState) {
|
||||
zzLexicalState = newState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the text matched by the current regular expression.
|
||||
*/
|
||||
public final String yytext() {
|
||||
return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character at position <tt>pos</tt> from the matched text.
|
||||
*
|
||||
* It is equivalent to yytext().charAt(pos), but faster
|
||||
*
|
||||
* @param pos the position of the character to fetch. A value from 0 to
|
||||
* yylength()-1.
|
||||
*
|
||||
* @return the character at position pos
|
||||
*/
|
||||
public final char yycharat(int pos) {
|
||||
return zzBuffer[zzStartRead + pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the length of the matched text region.
|
||||
*/
|
||||
public final int yylength() {
|
||||
return zzMarkedPos - zzStartRead;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports an error that occured while scanning.
|
||||
*
|
||||
* In a wellformed scanner (no or only correct usage of yypushback(int) and a
|
||||
* match-all fallback rule) this method will only be called with things that
|
||||
* "Can't Possibly Happen". If this method is called, something is seriously
|
||||
* wrong (e.g. a JFlex bug producing a faulty scanner etc.).
|
||||
*
|
||||
* Usual syntax/scanner level error handling should be done in error fallback
|
||||
* rules.
|
||||
*
|
||||
* @param errorCode the code of the errormessage to display
|
||||
*/
|
||||
private void zzScanError(int errorCode) {
|
||||
String message;
|
||||
try {
|
||||
message = ZZ_ERROR_MSG[errorCode];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
|
||||
}
|
||||
throw new Error(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes the specified amount of characters back into the input stream.
|
||||
*
|
||||
* They will be read again by then next call of the scanning method
|
||||
*
|
||||
* @param number the number of characters to be read again. This number must not
|
||||
* be greater than yylength()!
|
||||
*/
|
||||
public void yypushback(int number) {
|
||||
if (number > yylength())
|
||||
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||
zzMarkedPos -= number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resumes scanning until the next regular expression is matched, the end of
|
||||
* input is encountered or an I/O-Error occurs.
|
||||
*
|
||||
* @return the next token
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
|
||||
int zzInput;
|
||||
int zzAction;
|
||||
// cached fields:
|
||||
int zzCurrentPosL;
|
||||
int zzMarkedPosL;
|
||||
int zzEndReadL = zzEndRead;
|
||||
char[] zzBufferL = zzBuffer;
|
||||
char[] zzCMapL = ZZ_CMAP;
|
||||
int[] zzTransL = ZZ_TRANS;
|
||||
int[] zzRowMapL = ZZ_ROWMAP;
|
||||
int[] zzAttrL = ZZ_ATTRIBUTE;
|
||||
int zzPushbackPosL = zzPushbackPos = -1;
|
||||
boolean zzWasPushback;
|
||||
while (true) {
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzAction = -1;
|
||||
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
|
||||
zzState = zzLexicalState;
|
||||
zzWasPushback = false;
|
||||
zzForAction: {
|
||||
while (true) {
|
||||
if (zzCurrentPosL < zzEndReadL)
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
else if (zzAtEOF) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
// store back cached positions
|
||||
zzCurrentPos = zzCurrentPosL;
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
zzPushbackPos = zzPushbackPosL;
|
||||
boolean eof = zzRefill();
|
||||
// get translated positions and possibly new buffer
|
||||
zzCurrentPosL = zzCurrentPos;
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzBufferL = zzBuffer;
|
||||
zzEndReadL = zzEndRead;
|
||||
zzPushbackPosL = zzPushbackPos;
|
||||
if (eof) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
}
|
||||
}
|
||||
int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
|
||||
if (zzNext == -1)
|
||||
break zzForAction;
|
||||
zzState = zzNext;
|
||||
int zzAttributes = zzAttrL[zzState];
|
||||
if ((zzAttributes & 2) == 2)
|
||||
zzPushbackPosL = zzCurrentPosL;
|
||||
if ((zzAttributes & 1) == 1) {
|
||||
zzWasPushback = (zzAttributes & 4) == 4;
|
||||
zzAction = zzState;
|
||||
zzMarkedPosL = zzCurrentPosL;
|
||||
if ((zzAttributes & 8) == 8)
|
||||
break zzForAction;
|
||||
}
|
||||
}
|
||||
}
|
||||
// store back cached position
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
if (zzWasPushback)
|
||||
zzMarkedPos = zzPushbackPosL;
|
||||
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||
case 13: {
|
||||
addToken(Token.RESERVED_WORD);
|
||||
}
|
||||
case 16:
|
||||
break;
|
||||
case 1: {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
case 17:
|
||||
break;
|
||||
case 10: {
|
||||
addToken(Token.LITERAL_NUMBER_FLOAT);
|
||||
}
|
||||
case 18:
|
||||
break;
|
||||
case 8: {
|
||||
addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
}
|
||||
case 19:
|
||||
break;
|
||||
case 12: {
|
||||
addToken(Token.VARIABLE);
|
||||
}
|
||||
case 20:
|
||||
break;
|
||||
case 9: {
|
||||
if (highlightEolComments) {
|
||||
start = zzMarkedPos - 2;
|
||||
yybegin(EOL_COMMENT);
|
||||
} else {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
}
|
||||
case 21:
|
||||
break;
|
||||
case 2: {
|
||||
addToken(Token.WHITESPACE);
|
||||
}
|
||||
case 22:
|
||||
break;
|
||||
case 15: {
|
||||
int temp = zzStartRead;
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
|
||||
addHyperlinkToken(temp, zzMarkedPos - 1, Token.COMMENT_EOL);
|
||||
start = zzMarkedPos;
|
||||
}
|
||||
case 23:
|
||||
break;
|
||||
case 3: {
|
||||
addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
|
||||
}
|
||||
case 24:
|
||||
break;
|
||||
case 14: {
|
||||
addToken(Token.LITERAL_BOOLEAN);
|
||||
}
|
||||
case 25:
|
||||
break;
|
||||
case 4: {
|
||||
addToken(Token.ERROR_STRING_DOUBLE);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 26:
|
||||
break;
|
||||
case 7: {
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 27:
|
||||
break;
|
||||
case 11: {
|
||||
addToken(Token.ERROR_STRING_DOUBLE);
|
||||
}
|
||||
case 28:
|
||||
break;
|
||||
case 6: {
|
||||
}
|
||||
case 29:
|
||||
break;
|
||||
case 5: {
|
||||
addToken(Token.SEPARATOR);
|
||||
}
|
||||
case 30:
|
||||
break;
|
||||
default:
|
||||
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
|
||||
zzAtEOF = true;
|
||||
switch (zzLexicalState) {
|
||||
case EOL_COMMENT: {
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 56:
|
||||
break;
|
||||
case YYINITIAL: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 57:
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,275 +0,0 @@
|
||||
/*
|
||||
* 04/24/2012
|
||||
*
|
||||
* LatexTokenMaker.java - Scanner for LaTeX.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for the LaTeX.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RSTA always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>LatexTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class LatexTokenMaker
|
||||
%extends AbstractJFlexTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public LatexTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addHyperlinkToken(int, int, int)
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
* @param hyperlink Whether this token is a hyperlink.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType,
|
||||
int startOffset, boolean hyperlink) {
|
||||
super.addToken(array, start,end, tokenType, startOffset, hyperlink);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* ${inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "%", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
@Override
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
* @exception IOException if any I/O-Error occurs.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Letter = ([A-Za-z])
|
||||
Digit = ([0-9])
|
||||
LetterOrUnderscore = ({Letter}|[_])
|
||||
AnyChar = ({LetterOrUnderscore}|{Digit}|[\-])
|
||||
Whitespace = ([ \t\f])
|
||||
LineCommentBegin = "%"
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$]|{Letter}|{Digit})
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
|
||||
%state EOL_COMMENT
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
([\\]{AnyChar}+) { addToken(Token.FUNCTION); }
|
||||
([\\]%) { int temp = zzStartRead;
|
||||
addToken(temp, temp, Token.SEPARATOR);
|
||||
addToken(temp + 1, temp + 1, Token.IDENTIFIER);
|
||||
}
|
||||
[\{\}] { addToken(Token.SEPARATOR); }
|
||||
("\\begin{"{AnyChar}+"}") { int temp = zzStartRead;
|
||||
addToken(temp, temp+5, Token.RESERVED_WORD);
|
||||
addToken(temp+6, temp+6, Token.SEPARATOR);
|
||||
addToken(temp+7, zzMarkedPos-2, Token.RESERVED_WORD);
|
||||
addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
|
||||
}
|
||||
("\\end{"{AnyChar}+"}") { int temp = zzStartRead;
|
||||
addToken(temp, temp+3, Token.RESERVED_WORD);
|
||||
addToken(temp+4, temp+4, Token.SEPARATOR);
|
||||
addToken(temp+5, zzMarkedPos-2, Token.RESERVED_WORD);
|
||||
addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
|
||||
}
|
||||
{Whitespace} { addToken(Token.WHITESPACE); }
|
||||
|
||||
{LineCommentBegin} { start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
|
||||
|
||||
"\n" |
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters and flag them as identifiers. */
|
||||
{AnyChar}+ |
|
||||
. { addToken(Token.IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<EOL_COMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
}
|
||||
@@ -1,662 +0,0 @@
|
||||
/* The following code was generated by JFlex 1.4.1 on 8/20/16 5:08 PM */
|
||||
/*
|
||||
* 04/24/2012
|
||||
* LatexTokenMaker.java - Scanner for LaTeX.
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
|
||||
import org.fife.ui.rsyntaxtextarea.Token;
|
||||
import org.fife.ui.rsyntaxtextarea.TokenImpl;
|
||||
|
||||
/**
|
||||
* Scanner for the LaTeX.
|
||||
* <p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost completely
|
||||
* removed to be competitive with the handwritten lexers (subclasses of
|
||||
* <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around). We can
|
||||
* achieve this because RSTA always scans exactly 1 line of tokens at a time,
|
||||
* and hands the scanner this line as an array of characters (a Segment really).
|
||||
* Since tokens contain pointers to char arrays instead of Strings holding their
|
||||
* contents, there is no need for allocating new memory for Strings.
|
||||
* <p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.
|
||||
* <p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>LatexTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>. You
|
||||
* should hand-delete the second of each definition (the ones generated by the
|
||||
* lexer), as these generated methods modify the input buffer, which we'll never
|
||||
* have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT be
|
||||
* initialized. This is a needless memory allocation for us since we will be
|
||||
* pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would with
|
||||
* any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
public class LatexTokenMaker extends AbstractJFlexTokenMaker {
|
||||
|
||||
/** This character denotes the end of file */
|
||||
public static final int YYEOF = -1;
|
||||
/** lexical states */
|
||||
public static final int EOL_COMMENT = 1;
|
||||
public static final int YYINITIAL = 0;
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final String ZZ_CMAP_PACKED = "\11\0\1\3\1\32\1\0\1\3\23\0\1\3\1\5\1\0\1\5"
|
||||
+ "\1\7\1\4\7\5\1\2\1\22\1\6\12\1\1\20\1\5\1\0" + "\1\5\1\0\2\5\32\1\1\5\1\23\1\5\1\0\1\2\1\0"
|
||||
+ "\1\1\1\25\1\1\1\31\1\17\1\14\1\26\1\10\1\15\2\1" + "\1\16\1\1\1\27\1\1\1\12\2\1\1\13\1\11\2\1\1\21"
|
||||
+ "\3\1\1\30\1\0\1\24\1\5\uff81\0";
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
|
||||
/**
|
||||
* Translates DFA states to action switch labels.
|
||||
*/
|
||||
private static final int[] ZZ_ACTION = zzUnpackAction();
|
||||
private static final String ZZ_ACTION_PACKED_0 = "\2\0\2\1\1\2\1\3\1\1\1\4\1\5\4\6"
|
||||
+ "\1\7\1\10\1\11\2\10\4\0\2\10\4\0\2\10" + "\2\0\1\12\1\0\1\10\3\0\1\10\1\13\2\0" + "\1\14";
|
||||
|
||||
private static int[] zzUnpackAction() {
|
||||
int[] result = new int[43];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAction(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a state to a row index in the transition table
|
||||
*/
|
||||
private static final int[] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\33\0\66\0\121\0\66\0\66\0\154\0\66"
|
||||
+ "\0\66\0\207\0\242\0\275\0\330\0\66\0\363\0\66"
|
||||
+ "\0\u010e\0\u0129\0\u0144\0\u015f\0\u017a\0\u0195\0\u01b0\0\u01cb"
|
||||
+ "\0\u01e6\0\u0201\0\u021c\0\u0237\0\u0252\0\u026d\0\u0288\0\u02a3"
|
||||
+ "\0\u02be\0\u02d9\0\u02f4\0\u030f\0\u02be\0\u032a\0\u0345\0\66" + "\0\u0360\0\u037b\0\66";
|
||||
|
||||
private static int[] zzUnpackRowMap() {
|
||||
int[] result = new int[43];
|
||||
int offset = 0;
|
||||
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackRowMap(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int high = packed.charAt(i++) << 16;
|
||||
result[j++] = high | packed.charAt(i++);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* The transition table of the DFA
|
||||
*/
|
||||
private static final int[] ZZ_TRANS = zzUnpackTrans();
|
||||
private static final String ZZ_TRANS_PACKED_0 = "\1\3\2\4\1\5\1\6\3\3\10\4\1\3\1\4"
|
||||
+ "\1\3\1\7\1\10\3\4\1\10\1\4\1\11\10\12" + "\1\13\3\12\1\14\4\12\1\15\10\12\1\16\34\0"
|
||||
+ "\2\4\5\0\10\4\1\0\1\4\3\0\3\4\1\0" + "\1\4\2\0\2\17\1\0\1\20\3\0\7\17\1\21"
|
||||
+ "\1\0\1\17\3\0\1\22\2\17\1\0\1\17\1\0" + "\10\12\1\0\3\12\1\0\4\12\1\0\10\12\12\0"
|
||||
+ "\1\23\32\0\1\24\3\0\1\25\36\0\1\26\12\0" + "\2\17\5\0\10\17\1\0\1\17\3\0\3\17\1\0"
|
||||
+ "\1\17\2\0\2\17\5\0\10\17\1\0\1\17\3\0" + "\2\17\1\27\1\0\1\17\2\0\2\17\5\0\7\17"
|
||||
+ "\1\30\1\0\1\17\3\0\3\17\1\0\1\17\12\0" + "\1\31\33\0\1\32\36\0\1\33\35\0\1\34\12\0"
|
||||
+ "\2\17\5\0\10\17\1\0\1\17\3\0\3\17\1\0" + "\1\35\2\0\2\17\5\0\10\17\1\0\1\17\3\0"
|
||||
+ "\1\17\1\36\1\17\1\0\1\17\13\0\1\37\40\0" + "\1\40\31\0\1\32\35\0\1\41\11\0\2\17\5\0"
|
||||
+ "\10\17\1\0\1\17\3\0\3\17\1\42\1\17\2\0" + "\2\17\5\0\5\17\1\43\2\17\1\0\1\17\3\0"
|
||||
+ "\3\17\1\0\1\17\14\0\1\32\4\0\1\40\20\0" + "\1\44\25\0\1\41\1\45\1\0\2\45\12\41\1\45"
|
||||
+ "\1\41\1\45\2\0\3\41\1\0\1\41\2\0\2\46" + "\5\0\10\46\1\0\1\46\3\0\3\46\1\0\1\46"
|
||||
+ "\2\0\2\17\5\0\10\17\1\0\1\17\3\0\2\17" + "\1\47\1\0\1\17\7\0\1\41\25\0\2\46\5\0"
|
||||
+ "\10\46\1\0\1\46\2\0\1\50\3\46\1\0\1\46" + "\2\0\2\17\5\0\10\17\1\0\1\17\3\0\3\17"
|
||||
+ "\1\51\1\17\2\0\2\52\5\0\10\52\1\0\1\52" + "\3\0\3\52\1\0\1\52\2\0\2\52\5\0\10\52"
|
||||
+ "\1\0\1\52\2\0\1\53\3\52\1\0\1\52\1\0";
|
||||
|
||||
private static int[] zzUnpackTrans() {
|
||||
int[] result = new int[918];
|
||||
int offset = 0;
|
||||
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackTrans(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
value--;
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/* error codes */
|
||||
private static final int ZZ_UNKNOWN_ERROR = 0;
|
||||
private static final int ZZ_NO_MATCH = 1;
|
||||
private static final int ZZ_PUSHBACK_2BIG = 2;
|
||||
/* error messages for the codes above */
|
||||
private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input",
|
||||
"Error: pushback value was too large" };
|
||||
/**
|
||||
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
|
||||
*/
|
||||
private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 = "\2\0\1\11\1\1\2\11\1\1\2\11\4\1\1\11"
|
||||
+ "\1\1\1\11\2\1\4\0\2\1\4\0\2\1\2\0" + "\1\1\1\0\1\1\3\0\1\1\1\11\2\0\1\11";
|
||||
|
||||
private static int[] zzUnpackAttribute() {
|
||||
int[] result = new int[43];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAttribute(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/** the input device */
|
||||
private java.io.Reader zzReader;
|
||||
/** the current state of the DFA */
|
||||
private int zzState;
|
||||
/** the current lexical state */
|
||||
private int zzLexicalState = YYINITIAL;
|
||||
/**
|
||||
* this buffer contains the current text to be matched and is the source of the
|
||||
* yytext() string
|
||||
*/
|
||||
private char zzBuffer[];
|
||||
/** the textposition at the last accepting state */
|
||||
private int zzMarkedPos;
|
||||
/** the current text position in the buffer */
|
||||
private int zzCurrentPos;
|
||||
/** startRead marks the beginning of the yytext() string in the buffer */
|
||||
private int zzStartRead;
|
||||
/**
|
||||
* endRead marks the last character in the buffer, that has been read from input
|
||||
*/
|
||||
private int zzEndRead;
|
||||
/** zzAtEOF == true <=> the scanner is at the EOF */
|
||||
private boolean zzAtEOF;
|
||||
/* user code: */
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a no-parameter
|
||||
* constructor.
|
||||
*/
|
||||
public LatexTokenMaker() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos - 1, tokenType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addHyperlinkToken(int, int, int)
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token occurs.
|
||||
* @param hyperlink Whether this token is a hyperlink.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset, boolean hyperlink) {
|
||||
super.addToken(array, start, end, tokenType, startOffset, hyperlink);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
/**
|
||||
* ${inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "%", null };
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated from
|
||||
* <code>text</code>. This method must be implemented by subclasses so they can
|
||||
* correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing the syntax
|
||||
* highlighted text.
|
||||
*/
|
||||
@Override
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise <code>false</code>.
|
||||
* @exception IOException if any I/O-Error occurs.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos >= s.offset + s.count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream. Does not close the old
|
||||
* reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream <b>cannot</b> be
|
||||
* reused (internal buffer is discarded and lost). Lexical state is set to
|
||||
* <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill no longer
|
||||
* "refills" the buffer (since the way we do it, it's always "full" the first
|
||||
* time through, since it points to the segment's array). So, we assign
|
||||
* zzEndRead here.
|
||||
*/
|
||||
// zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner There is also a java.io.InputStream version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
public LatexTokenMaker(java.io.Reader in) {
|
||||
this.zzReader = in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner. There is also java.io.Reader version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Inputstream to read input from.
|
||||
*/
|
||||
public LatexTokenMaker(java.io.InputStream in) {
|
||||
this(new java.io.InputStreamReader(in));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unpacks the compressed character translation table.
|
||||
*
|
||||
* @param packed the packed character translation table
|
||||
* @return the unpacked character translation table
|
||||
*/
|
||||
private static char[] zzUnpackCMap(String packed) {
|
||||
char[] map = new char[0x10000];
|
||||
int i = 0; /* index in packed string */
|
||||
int j = 0; /* index in unpacked array */
|
||||
while (i < 112) {
|
||||
int count = packed.charAt(i++);
|
||||
char value = packed.charAt(i++);
|
||||
do
|
||||
map[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the input stream.
|
||||
*/
|
||||
public final void yyclose() throws java.io.IOException {
|
||||
zzAtEOF = true; /* indicate end of file */
|
||||
zzEndRead = zzStartRead; /* invalidate buffer */
|
||||
if (zzReader != null)
|
||||
zzReader.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current lexical state.
|
||||
*/
|
||||
public final int yystate() {
|
||||
return zzLexicalState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enters a new lexical state
|
||||
*
|
||||
* @param newState the new lexical state
|
||||
*/
|
||||
@Override
|
||||
public final void yybegin(int newState) {
|
||||
zzLexicalState = newState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the text matched by the current regular expression.
|
||||
*/
|
||||
public final String yytext() {
|
||||
return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character at position <tt>pos</tt> from the matched text.
|
||||
*
|
||||
* It is equivalent to yytext().charAt(pos), but faster
|
||||
*
|
||||
* @param pos the position of the character to fetch. A value from 0 to
|
||||
* yylength()-1.
|
||||
*
|
||||
* @return the character at position pos
|
||||
*/
|
||||
public final char yycharat(int pos) {
|
||||
return zzBuffer[zzStartRead + pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the length of the matched text region.
|
||||
*/
|
||||
public final int yylength() {
|
||||
return zzMarkedPos - zzStartRead;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports an error that occured while scanning.
|
||||
*
|
||||
* In a wellformed scanner (no or only correct usage of yypushback(int) and a
|
||||
* match-all fallback rule) this method will only be called with things that
|
||||
* "Can't Possibly Happen". If this method is called, something is seriously
|
||||
* wrong (e.g. a JFlex bug producing a faulty scanner etc.).
|
||||
*
|
||||
* Usual syntax/scanner level error handling should be done in error fallback
|
||||
* rules.
|
||||
*
|
||||
* @param errorCode the code of the errormessage to display
|
||||
*/
|
||||
private void zzScanError(int errorCode) {
|
||||
String message;
|
||||
try {
|
||||
message = ZZ_ERROR_MSG[errorCode];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
|
||||
}
|
||||
throw new Error(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes the specified amount of characters back into the input stream.
|
||||
*
|
||||
* They will be read again by then next call of the scanning method
|
||||
*
|
||||
* @param number the number of characters to be read again. This number must not
|
||||
* be greater than yylength()!
|
||||
*/
|
||||
public void yypushback(int number) {
|
||||
if (number > yylength())
|
||||
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||
zzMarkedPos -= number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resumes scanning until the next regular expression is matched, the end of
|
||||
* input is encountered or an I/O-Error occurs.
|
||||
*
|
||||
* @return the next token
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
|
||||
int zzInput;
|
||||
int zzAction;
|
||||
// cached fields:
|
||||
int zzCurrentPosL;
|
||||
int zzMarkedPosL;
|
||||
int zzEndReadL = zzEndRead;
|
||||
char[] zzBufferL = zzBuffer;
|
||||
char[] zzCMapL = ZZ_CMAP;
|
||||
int[] zzTransL = ZZ_TRANS;
|
||||
int[] zzRowMapL = ZZ_ROWMAP;
|
||||
int[] zzAttrL = ZZ_ATTRIBUTE;
|
||||
while (true) {
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzAction = -1;
|
||||
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
|
||||
zzState = zzLexicalState;
|
||||
zzForAction: {
|
||||
while (true) {
|
||||
if (zzCurrentPosL < zzEndReadL)
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
else if (zzAtEOF) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
// store back cached positions
|
||||
zzCurrentPos = zzCurrentPosL;
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
boolean eof = zzRefill();
|
||||
// get translated positions and possibly new buffer
|
||||
zzCurrentPosL = zzCurrentPos;
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzBufferL = zzBuffer;
|
||||
zzEndReadL = zzEndRead;
|
||||
if (eof) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
}
|
||||
}
|
||||
int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
|
||||
if (zzNext == -1)
|
||||
break zzForAction;
|
||||
zzState = zzNext;
|
||||
int zzAttributes = zzAttrL[zzState];
|
||||
if ((zzAttributes & 1) == 1) {
|
||||
zzAction = zzState;
|
||||
zzMarkedPosL = zzCurrentPosL;
|
||||
if ((zzAttributes & 8) == 8)
|
||||
break zzForAction;
|
||||
}
|
||||
}
|
||||
}
|
||||
// store back cached position
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||
case 1: {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
case 13:
|
||||
break;
|
||||
case 8: {
|
||||
addToken(Token.FUNCTION);
|
||||
}
|
||||
case 14:
|
||||
break;
|
||||
case 2: {
|
||||
addToken(Token.WHITESPACE);
|
||||
}
|
||||
case 15:
|
||||
break;
|
||||
case 12: {
|
||||
int temp = zzStartRead;
|
||||
addToken(temp, temp + 5, Token.RESERVED_WORD);
|
||||
addToken(temp + 6, temp + 6, Token.SEPARATOR);
|
||||
addToken(temp + 7, zzMarkedPos - 2, Token.RESERVED_WORD);
|
||||
addToken(zzMarkedPos - 1, zzMarkedPos - 1, Token.SEPARATOR);
|
||||
}
|
||||
case 16:
|
||||
break;
|
||||
case 10: {
|
||||
int temp = zzStartRead;
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
|
||||
addHyperlinkToken(temp, zzMarkedPos - 1, Token.COMMENT_EOL);
|
||||
start = zzMarkedPos;
|
||||
}
|
||||
case 17:
|
||||
break;
|
||||
case 3: {
|
||||
start = zzMarkedPos - 1;
|
||||
yybegin(EOL_COMMENT);
|
||||
}
|
||||
case 18:
|
||||
break;
|
||||
case 11: {
|
||||
int temp = zzStartRead;
|
||||
addToken(temp, temp + 3, Token.RESERVED_WORD);
|
||||
addToken(temp + 4, temp + 4, Token.SEPARATOR);
|
||||
addToken(temp + 5, zzMarkedPos - 2, Token.RESERVED_WORD);
|
||||
addToken(zzMarkedPos - 1, zzMarkedPos - 1, Token.SEPARATOR);
|
||||
}
|
||||
case 19:
|
||||
break;
|
||||
case 5: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 20:
|
||||
break;
|
||||
case 7: {
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 21:
|
||||
break;
|
||||
case 9: {
|
||||
int temp = zzStartRead;
|
||||
addToken(temp, temp, Token.SEPARATOR);
|
||||
addToken(temp + 1, temp + 1, Token.IDENTIFIER);
|
||||
}
|
||||
case 22:
|
||||
break;
|
||||
case 6: {
|
||||
}
|
||||
case 23:
|
||||
break;
|
||||
case 4: {
|
||||
addToken(Token.SEPARATOR);
|
||||
}
|
||||
case 24:
|
||||
break;
|
||||
default:
|
||||
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
|
||||
zzAtEOF = true;
|
||||
switch (zzLexicalState) {
|
||||
case EOL_COMMENT: {
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 44:
|
||||
break;
|
||||
case YYINITIAL: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 45:
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
/*
|
||||
* 08/23/2015
|
||||
* Copyright (C) 2015 Robert Futrell
|
||||
* robert_futrell at users.sourceforge.net
|
||||
* http://fifesoft.com/rsyntaxtextarea
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSTALanguageSupport.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.TokenTypes;
|
||||
|
||||
/**
|
||||
* Scanner for Less files.
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 1.0
|
||||
*/
|
||||
public class LessTokenMaker extends CSSTokenMaker {
|
||||
|
||||
/**
|
||||
* Constructor; overridden to enable the niceties added by Less.
|
||||
*/
|
||||
public LessTokenMaker() {
|
||||
setHighlightingLess(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "//", null };
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public boolean getMarkOccurrencesOfTokenType(int type) {
|
||||
return type == TokenTypes.VARIABLE || super.getMarkOccurrencesOfTokenType(type);
|
||||
}
|
||||
}
|
||||
@@ -1,429 +0,0 @@
|
||||
/*
|
||||
* 11/13/2004
|
||||
*
|
||||
* LispTokenMaker.java - Scanner for the Lisp programming language.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for the Lisp programming language.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>LispTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class LispTokenMaker
|
||||
%extends AbstractJFlexTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public LispTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addHyperlinkToken(int, int, int)
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
* @param hyperlink Whether this token is a hyperlink.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType,
|
||||
int startOffset, boolean hyperlink) {
|
||||
super.addToken(array, start,end, tokenType, startOffset, hyperlink);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { ";", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.COMMENT_MULTILINE:
|
||||
state = MLC;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = STRING;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Letter = [A-Za-z]
|
||||
LetterOrUnderscore = ({Letter}|"_")
|
||||
NonzeroDigit = [1-9]
|
||||
Digit = ("0"|{NonzeroDigit})
|
||||
HexDigit = ({Digit}|[A-Fa-f])
|
||||
OctalDigit = ([0-7])
|
||||
EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
|
||||
NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
|
||||
IdentifierStart = ({LetterOrUnderscore}|"$")
|
||||
IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
|
||||
|
||||
LineTerminator = (\n)
|
||||
WhiteSpace = ([ \t\f])
|
||||
|
||||
MLCBegin = "#|"
|
||||
MLCEnd = "|#"
|
||||
LineCommentBegin = ";"
|
||||
|
||||
IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
|
||||
IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
|
||||
IntegerLiteral = ({IntegerHelper1}[lL]?)
|
||||
HexLiteral = ({IntegerHelper2}[lL]?)
|
||||
FloatHelper1 = ([fFdD]?)
|
||||
FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
|
||||
FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
|
||||
FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
|
||||
FloatLiteral3 = ({Digit}+{FloatHelper2})
|
||||
FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
|
||||
ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
|
||||
|
||||
Separator = ([\(\)])
|
||||
|
||||
NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
|
||||
AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
|
||||
Operator = ({NonAssignmentOperator}|{AssignmentOperator})
|
||||
|
||||
Identifier = ({IdentifierStart}{IdentifierPart}*)
|
||||
ErrorIdentifier = ({NonSeparator}+)
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$]|{Letter}|{Digit})
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
|
||||
%state STRING
|
||||
%state MLC
|
||||
%state EOL_COMMENT
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
"defclass" |
|
||||
"defconstant" |
|
||||
"defgeneric" |
|
||||
"define-compiler-macro" |
|
||||
"define-condition" |
|
||||
"define-method-combination" |
|
||||
"define-modify-macro" |
|
||||
"define-setf-expander" |
|
||||
"define-symbol-macro" |
|
||||
"defmacro" |
|
||||
"defmethod" |
|
||||
"defpackage" |
|
||||
"defparameter" |
|
||||
"defsetf" |
|
||||
"defstruct" |
|
||||
"deftype" |
|
||||
"defun" |
|
||||
"defvar" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
"abort" |
|
||||
"assert" |
|
||||
"block" |
|
||||
"break" |
|
||||
"case" |
|
||||
"catch" |
|
||||
"ccase" |
|
||||
"cerror" |
|
||||
"cond" |
|
||||
"ctypecase" |
|
||||
"declaim" |
|
||||
"declare" |
|
||||
"do" |
|
||||
"do*" |
|
||||
"do-all-symbols" |
|
||||
"do-external-symbols" |
|
||||
"do-symbols" |
|
||||
"dolist" |
|
||||
"dotimes" |
|
||||
"ecase" |
|
||||
"error" |
|
||||
"etypecase" |
|
||||
"eval-when" |
|
||||
"flet" |
|
||||
"handler-bind" |
|
||||
"handler-case" |
|
||||
"if" |
|
||||
"ignore-errors" |
|
||||
"in-package" |
|
||||
"labels" |
|
||||
"lambda" |
|
||||
"let" |
|
||||
"let*" |
|
||||
"locally" |
|
||||
"loop" |
|
||||
"macrolet" |
|
||||
"multiple-value-bind" |
|
||||
"proclaim" |
|
||||
"prog" |
|
||||
"prog*" |
|
||||
"prog1" |
|
||||
"prog2" |
|
||||
"progn" |
|
||||
"progv" |
|
||||
"provide" |
|
||||
"require" |
|
||||
"restart-bind" |
|
||||
"restart-case" |
|
||||
"restart-name" |
|
||||
"return" |
|
||||
"return-from" |
|
||||
"signal" |
|
||||
"symbol-macrolet" |
|
||||
"tagbody" |
|
||||
"the" |
|
||||
"throw" |
|
||||
"typecase" |
|
||||
"unless" |
|
||||
"unwind-protect" |
|
||||
"when" |
|
||||
"with-accessors" |
|
||||
"with-compilation-unit" |
|
||||
"with-condition-restarts" |
|
||||
"with-hash-table-iterator" |
|
||||
"with-input-from-string" |
|
||||
"with-open-file" |
|
||||
"with-open-stream" |
|
||||
"with-output-to-string" |
|
||||
"with-package-iterator" |
|
||||
"with-simple-restart" |
|
||||
"with-slots" |
|
||||
"with-standard-io-syntax" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
{WhiteSpace}+ { addToken(Token.WHITESPACE); }
|
||||
[\"] { start = zzMarkedPos-1; yybegin(STRING); }
|
||||
{MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
|
||||
{LineCommentBegin} { start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
|
||||
{Separator} { addToken(Token.SEPARATOR); }
|
||||
{Operator} { addToken(Token.OPERATOR); }
|
||||
|
||||
/* Numbers */
|
||||
{IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
|
||||
{FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
{ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
|
||||
|
||||
{ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters and flag them as bad. */
|
||||
. { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<STRING> {
|
||||
[^\n\\\"]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
\" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<MLC> {
|
||||
|
||||
[^hwf\n\|]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
{MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
|
||||
\| {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<EOL_COMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,369 +0,0 @@
|
||||
/*
|
||||
* 07/14/2006
|
||||
*
|
||||
* LuaTokenMaker.java - Scanner for the Lua programming language.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for the Lua programming language.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>LuaTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.4
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class LuaTokenMaker
|
||||
%extends AbstractJFlexTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public LuaTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "--", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.COMMENT_MULTILINE:
|
||||
state = MLC;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = LONGSTRING;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Letter = [A-Za-z_]
|
||||
Digit = [0-9]
|
||||
|
||||
LineTerminator = (\n)
|
||||
WhiteSpace = ([ \t\f])
|
||||
|
||||
UnclosedCharLiteral = ([\']([^\'\n]|"\\'")*)
|
||||
CharLiteral = ({UnclosedCharLiteral}"'")
|
||||
UnclosedStringLiteral = ([\"]([^\"\n]|"\\\"")*)
|
||||
StringLiteral = ({UnclosedStringLiteral}[\"])
|
||||
LongStringBegin = ("[[")
|
||||
LongStringEnd = ("]]")
|
||||
|
||||
LineCommentBegin = ("--")
|
||||
MLCBegin = ({LineCommentBegin}{LongStringBegin})
|
||||
|
||||
Number = ( "."? {Digit} ({Digit}|".")* ([eE][+-]?)? ({Letter}|{Digit})* )
|
||||
BooleanLiteral = ("true"|"false")
|
||||
|
||||
Separator = ([\(\)\{\}\[\]\]])
|
||||
Separator2 = ([\;:,.])
|
||||
|
||||
ArithmeticOperator = ("+"|"-"|"*"|"/"|"^"|"%")
|
||||
RelationalOperator = ("<"|">"|"<="|">="|"=="|"~=")
|
||||
LogicalOperator = ("and"|"or"|"not"|"#")
|
||||
ConcatenationOperator = ("..")
|
||||
Elipsis = ({ConcatenationOperator}".")
|
||||
Operator = ({ArithmeticOperator}|{RelationalOperator}|{LogicalOperator}|{ConcatenationOperator}|{Elipsis})
|
||||
|
||||
Identifier = ({Letter}({Letter}|{Digit})*)
|
||||
|
||||
|
||||
%state MLC
|
||||
%state LONGSTRING
|
||||
%state LINECOMMENT
|
||||
|
||||
|
||||
%%
|
||||
|
||||
/* Keywords */
|
||||
<YYINITIAL> "break" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "do" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "else" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "elseif" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "end" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "for" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "function" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "if" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "local" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "nil" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "repeat" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "return" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "then" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "until" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "while" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
/* Data types. */
|
||||
<YYINITIAL> "<number>" { addToken(Token.DATA_TYPE); }
|
||||
<YYINITIAL> "<name>" { addToken(Token.DATA_TYPE); }
|
||||
<YYINITIAL> "<string>" { addToken(Token.DATA_TYPE); }
|
||||
<YYINITIAL> "<eof>" { addToken(Token.DATA_TYPE); }
|
||||
<YYINITIAL> "NULL" { addToken(Token.DATA_TYPE); }
|
||||
|
||||
/* Functions. */
|
||||
<YYINITIAL> "_G" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "_VERSION" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "assert" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "collectgarbage" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "dofile" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "error" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "getfenv" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "getmetatable" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "ipairs" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "load" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "loadfile" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "loadstring" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "module" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "next" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "pairs" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "pcall" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "print" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "rawequal" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "rawget" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "rawset" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "require" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "select" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "setfenv" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "setmetatable" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "tonumber" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "tostring" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "type" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "unpack" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "xpcall" { addToken(Token.FUNCTION); }
|
||||
|
||||
/* Booleans. */
|
||||
<YYINITIAL> {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
|
||||
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
|
||||
{WhiteSpace}+ { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* String/Character literals. */
|
||||
{CharLiteral} { addToken(Token.LITERAL_CHAR); }
|
||||
{UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
|
||||
{StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
{UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
{LongStringBegin} { start = zzMarkedPos-2; yybegin(LONGSTRING); }
|
||||
|
||||
/* Comment literals. */
|
||||
{MLCBegin} { start = zzMarkedPos-4; yybegin(MLC); }
|
||||
{LineCommentBegin} { start = zzMarkedPos-2; yybegin(LINECOMMENT); }
|
||||
|
||||
/* Separators. */
|
||||
{Separator} { addToken(Token.SEPARATOR); }
|
||||
{Separator2} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
/* Operators. */
|
||||
{Operator} { addToken(Token.OPERATOR); }
|
||||
|
||||
/* Identifiers - Comes after Operators for "and", "not" and "or". */
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
/* Numbers */
|
||||
{Number} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters. */
|
||||
. { addToken(Token.IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<MLC> {
|
||||
[^\n\]]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
{LongStringEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
|
||||
\] {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<LONGSTRING> {
|
||||
[^\n\]]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
{LongStringEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
\] {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<LINECOMMENT> {
|
||||
[^\n]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); return firstToken; }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); return firstToken; }
|
||||
}
|
||||
@@ -1,834 +0,0 @@
|
||||
/* The following code was generated by JFlex 1.4.1 on 10/16/06 10:31 AM */
|
||||
/*
|
||||
* 07/14/2006
|
||||
* LuaTokenMaker.java - Scanner for the Lua programming language.
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
|
||||
import org.fife.ui.rsyntaxtextarea.Token;
|
||||
import org.fife.ui.rsyntaxtextarea.TokenImpl;
|
||||
|
||||
/**
|
||||
* Scanner for the Lua programming language.
|
||||
* <p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost completely
|
||||
* removed to be competitive with the handwritten lexers (subclasses of
|
||||
* <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around). We can
|
||||
* achieve this because RText always scans exactly 1 line of tokens at a time,
|
||||
* and hands the scanner this line as an array of characters (a Segment really).
|
||||
* Since tokens contain pointers to char arrays instead of Strings holding their
|
||||
* contents, there is no need for allocating new memory for Strings.
|
||||
* <p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.
|
||||
* <p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>LuaTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>. You
|
||||
* should hand-delete the second of each definition (the ones generated by the
|
||||
* lexer), as these generated methods modify the input buffer, which we'll never
|
||||
* have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT be
|
||||
* initialized. This is a needless memory allocation for us since we will be
|
||||
* pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would with
|
||||
* any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.4
|
||||
*
|
||||
*/
|
||||
public class LuaTokenMaker extends AbstractJFlexTokenMaker {
|
||||
|
||||
/** This character denotes the end of file */
|
||||
public static final int YYEOF = -1;
|
||||
/** lexical states */
|
||||
public static final int YYINITIAL = 0;
|
||||
public static final int LONGSTRING = 2;
|
||||
public static final int LINECOMMENT = 3;
|
||||
public static final int MLC = 1;
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final String ZZ_CMAP_PACKED = "\11\0\1\4\1\3\1\0\1\4\23\0\1\4\1\0\1\7\1\27"
|
||||
+ "\1\0\1\27\1\0\1\5\2\26\1\27\1\15\1\0\1\12\1\13" + "\1\27\12\2\2\0\1\30\1\32\1\31\2\0\4\1\1\14\1\1"
|
||||
+ "\1\54\1\1\1\60\2\1\1\52\1\1\1\50\1\61\2\1\1\56" + "\1\57\1\1\1\51\1\55\4\1\1\10\1\6\1\11\1\27\1\53"
|
||||
+ "\1\0\1\23\1\37\1\42\1\35\1\21\1\22\1\47\1\44\1\41" + "\1\1\1\40\1\24\1\46\1\34\1\36\1\43\1\64\1\17\1\25"
|
||||
+ "\1\16\1\20\1\62\1\45\1\63\1\65\1\1\1\26\1\0\1\26" + "\1\33\uff81\0";
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
|
||||
/**
|
||||
* Translates DFA states to action switch labels.
|
||||
*/
|
||||
private static final int[] ZZ_ACTION = zzUnpackAction();
|
||||
private static final String ZZ_ACTION_PACKED_0 = "\4\0\2\1\1\2\1\3\1\4\1\5\1\6\2\7"
|
||||
+ "\1\10\1\1\1\10\10\1\2\10\16\1\1\11\1\12" + "\1\11\1\13\2\11\1\14\2\2\1\15\1\5\1\6"
|
||||
+ "\1\16\1\17\1\20\1\10\21\1\3\0\3\1\1\21" + "\1\10\1\1\1\21\11\1\1\22\2\1\1\23\1\24"
|
||||
+ "\1\15\1\16\1\0\24\1\4\0\13\1\1\25\1\26" + "\11\1\1\21\2\1\1\22\3\1\4\0\6\1\1\27"
|
||||
+ "\13\1\1\27\2\0\10\1\2\0\15\1";
|
||||
|
||||
private static int[] zzUnpackAction() {
|
||||
int[] result = new int[201];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAction(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a state to a row index in the transition table
|
||||
*/
|
||||
private static final int[] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\66\0\154\0\242\0\330\0\u010e\0\u0144\0\330"
|
||||
+ "\0\u017a\0\u01b0\0\u01e6\0\u021c\0\330\0\u0252\0\u0288\0\330"
|
||||
+ "\0\u02be\0\u02f4\0\u032a\0\u0360\0\u0396\0\u03cc\0\u0402\0\u0438"
|
||||
+ "\0\u046e\0\u04a4\0\u04a4\0\u04da\0\u0510\0\u0546\0\u057c\0\u05b2"
|
||||
+ "\0\u05e8\0\u061e\0\u0654\0\u068a\0\u06c0\0\u06f6\0\u072c\0\u0762"
|
||||
+ "\0\u0798\0\330\0\u07ce\0\330\0\u0804\0\u083a\0\330\0\u0870"
|
||||
+ "\0\u08a6\0\330\0\u08dc\0\u0912\0\330\0\330\0\u0948\0\u097e"
|
||||
+ "\0\u09b4\0\u09ea\0\u0a20\0\u0a56\0\u0a8c\0\u0ac2\0\u0af8\0\u0b2e"
|
||||
+ "\0\u0b64\0\u0b9a\0\u0bd0\0\u0c06\0\u0c3c\0\u0c72\0\u0ca8\0\u0cde"
|
||||
+ "\0\u0d14\0\u0d4a\0\u0d80\0\u0db6\0\u0dec\0\u0e22\0\u0e58\0\u0e8e"
|
||||
+ "\0\u010e\0\u0ec4\0\u010e\0\u0efa\0\u0f30\0\u0f66\0\u0f9c\0\u0fd2"
|
||||
+ "\0\u1008\0\u103e\0\u1074\0\u10aa\0\u010e\0\u10e0\0\u1116\0\330"
|
||||
+ "\0\330\0\u01b0\0\u01e6\0\u114c\0\u1182\0\u11b8\0\u11ee\0\u1224"
|
||||
+ "\0\u125a\0\u1290\0\u12c6\0\u12fc\0\u1332\0\u1368\0\u139e\0\u13d4"
|
||||
+ "\0\u140a\0\u1440\0\u1476\0\u14ac\0\u14e2\0\u1518\0\u154e\0\u1584"
|
||||
+ "\0\u15ba\0\u15f0\0\u1626\0\u165c\0\u1692\0\u16c8\0\u16fe\0\u1734"
|
||||
+ "\0\u176a\0\u17a0\0\u17d6\0\u180c\0\u1842\0\u1878\0\u18ae\0\330"
|
||||
+ "\0\u010e\0\u18e4\0\u191a\0\u1950\0\u1986\0\u19bc\0\u19f2\0\u1a28"
|
||||
+ "\0\u1a5e\0\u1a94\0\u1aca\0\u1b00\0\u1b36\0\u1b6c\0\u1ba2\0\u1bd8"
|
||||
+ "\0\u1c0e\0\u1c44\0\u1c7a\0\u1cb0\0\u1ce6\0\u1d1c\0\u1d52\0\u1d88"
|
||||
+ "\0\u1dbe\0\u1df4\0\u1e2a\0\u010e\0\u1e60\0\u1e96\0\u1ecc\0\u1f02"
|
||||
+ "\0\u1f38\0\u1f6e\0\u1fa4\0\u1fda\0\u2010\0\u2046\0\u207c\0\330"
|
||||
+ "\0\u20b2\0\u20e8\0\u211e\0\u2154\0\u218a\0\u21c0\0\u21f6\0\u222c"
|
||||
+ "\0\u2262\0\u2298\0\u22ce\0\u2304\0\u233a\0\u2370\0\u23a6\0\u23dc"
|
||||
+ "\0\u2412\0\u2448\0\u247e\0\u24b4\0\u24ea\0\u2520\0\u2556\0\u258c" + "\0\u25c2";
|
||||
|
||||
private static int[] zzUnpackRowMap() {
|
||||
int[] result = new int[201];
|
||||
int offset = 0;
|
||||
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackRowMap(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int high = packed.charAt(i++) << 16;
|
||||
result[j++] = high | packed.charAt(i++);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* The transition table of the DFA
|
||||
*/
|
||||
private static final int[] ZZ_TRANS = zzUnpackTrans();
|
||||
private static final String ZZ_TRANS_PACKED_0 = "\1\5\1\6\1\7\1\10\1\11\1\12\1\5\1\13"
|
||||
+ "\1\14\1\15\1\16\1\17\1\6\1\20\1\21\1\22" + "\1\23\1\24\1\25\1\26\1\27\1\30\1\15\1\20"
|
||||
+ "\1\31\1\32\2\33\1\34\1\35\1\36\1\37\1\6" + "\1\40\1\41\1\42\1\6\1\43\1\44\1\45\1\46"
|
||||
+ "\2\6\1\47\7\6\1\50\2\6\3\51\1\52\5\51" + "\1\53\57\51\1\54\5\51\1\55\54\51\3\56\1\57"
|
||||
+ "\62\56\67\0\2\6\11\0\1\6\1\0\10\6\6\0" + "\32\6\1\0\1\60\1\7\10\0\1\7\1\61\1\0"
|
||||
+ "\3\60\1\61\4\60\6\0\32\60\4\0\1\11\61\0" + "\3\12\1\0\1\12\1\62\1\63\57\12\3\13\1\0"
|
||||
+ "\2\13\1\64\1\65\56\13\10\0\1\66\67\0\1\67" + "\55\0\1\7\10\0\1\70\53\0\2\6\11\0\1\6"
|
||||
+ "\1\0\1\6\1\71\6\6\6\0\2\6\1\72\5\6" + "\1\73\20\6\1\74\1\0\2\6\11\0\1\6\1\0"
|
||||
+ "\3\6\1\75\1\6\1\76\2\6\6\0\32\6\1\0" + "\2\6\11\0\1\6\1\0\10\6\6\0\1\77\31\6"
|
||||
+ "\1\0\2\6\11\0\1\6\1\0\1\6\1\100\4\6" + "\1\101\1\6\6\0\1\102\31\6\1\0\2\6\11\0"
|
||||
+ "\1\6\1\0\2\6\1\103\2\6\1\104\2\6\6\0" + "\2\6\1\105\27\6\1\0\2\6\11\0\1\6\1\0"
|
||||
+ "\7\6\1\106\6\0\1\107\31\6\1\0\2\6\11\0" + "\1\6\1\0\10\6\6\0\2\6\1\110\27\6\1\0"
|
||||
+ "\2\6\11\0\1\6\1\0\3\6\1\111\4\6\6\0" + "\32\6\21\0\1\112\3\0\1\113\4\0\1\20\1\0"
|
||||
+ "\1\114\63\0\1\20\34\0\2\6\11\0\1\6\1\0" + "\3\6\1\115\4\6\6\0\2\6\1\116\2\6\1\117"
|
||||
+ "\24\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0" + "\2\6\1\120\27\6\1\0\2\6\11\0\1\6\1\0"
|
||||
+ "\1\6\1\121\6\6\6\0\32\6\1\0\2\6\11\0" + "\1\6\1\0\1\6\1\122\6\6\6\0\32\6\1\0"
|
||||
+ "\2\6\11\0\1\6\1\0\4\6\1\123\3\6\6\0" + "\7\6\1\124\22\6\1\0\2\6\11\0\1\6\1\0"
|
||||
+ "\10\6\6\0\2\6\1\125\27\6\1\0\2\6\11\0" + "\1\6\1\0\1\6\1\126\3\6\1\127\2\6\6\0"
|
||||
+ "\6\6\1\130\23\6\1\0\2\6\11\0\1\6\1\0" + "\10\6\6\0\10\6\1\131\21\6\1\0\2\6\11\0"
|
||||
+ "\1\6\1\0\10\6\6\0\2\6\1\132\27\6\1\0" + "\2\6\11\0\1\6\1\0\3\6\1\133\4\6\6\0"
|
||||
+ "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0" + "\15\6\1\134\14\6\1\0\2\6\11\0\1\6\1\0"
|
||||
+ "\10\6\6\0\20\6\1\135\1\136\10\6\1\0\2\6" + "\11\0\1\6\1\0\10\6\6\0\7\6\1\137\22\6"
|
||||
+ "\3\51\1\0\5\51\1\0\54\51\11\0\1\140\65\0" + "\1\141\54\0\3\56\1\0\62\56\1\0\2\60\11\0"
|
||||
+ "\1\60\1\0\10\60\6\0\32\60\1\0\2\60\7\0" + "\1\60\1\0\12\60\6\0\32\60\3\12\1\0\1\12"
|
||||
+ "\1\142\1\63\57\12\3\13\1\0\2\13\1\64\1\143" + "\56\13\10\0\1\144\70\0\1\20\53\0\2\6\11\0"
|
||||
+ "\1\6\1\0\2\6\1\145\5\6\6\0\32\6\1\0" + "\2\6\11\0\1\6\1\0\7\6\1\146\6\0\1\147"
|
||||
+ "\31\6\1\0\2\6\11\0\1\6\1\0\3\6\1\150" + "\4\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"
|
||||
+ "\10\6\6\0\7\6\1\151\22\6\1\0\2\6\11\0" + "\1\6\1\0\1\152\7\6\6\0\7\6\1\153\20\6"
|
||||
+ "\1\154\1\6\1\0\2\6\11\0\1\6\1\0\10\6" + "\6\0\11\6\1\155\20\6\1\0\2\6\11\0\1\6"
|
||||
+ "\1\0\1\156\7\6\6\0\7\6\1\157\22\6\1\0" + "\2\6\11\0\1\6\1\0\1\6\1\160\6\6\6\0"
|
||||
+ "\32\6\1\0\2\6\11\0\1\6\1\0\7\6\1\161" + "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"
|
||||
+ "\6\0\1\6\1\123\30\6\1\0\2\6\11\0\1\6" + "\1\0\10\6\6\0\1\162\31\6\1\0\2\6\11\0"
|
||||
+ "\1\6\1\0\6\6\1\163\1\6\6\0\32\6\1\0" + "\2\6\11\0\1\6\1\0\1\6\1\123\6\6\6\0"
|
||||
+ "\32\6\1\0\2\6\11\0\1\6\1\0\7\6\1\164" + "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"
|
||||
+ "\6\0\1\6\1\121\30\6\1\0\2\6\11\0\1\6" + "\1\0\5\6\1\165\2\6\6\0\6\6\1\166\23\6"
|
||||
+ "\1\0\2\6\11\0\1\6\1\0\1\167\5\6\1\170" + "\1\6\6\0\32\6\36\0\1\171\45\0\1\172\67\0"
|
||||
+ "\1\173\2\0\1\174\43\0\2\6\11\0\1\6\1\0" + "\10\6\6\0\27\6\1\175\2\6\1\0\2\6\11\0"
|
||||
+ "\1\6\1\0\1\121\7\6\6\0\32\6\1\0\2\6" + "\11\0\1\6\1\0\6\6\1\123\1\6\6\0\32\6"
|
||||
+ "\1\0\2\6\11\0\1\6\1\0\4\6\1\176\3\6" + "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\3\6"
|
||||
+ "\1\177\4\6\6\0\32\6\1\0\2\6\11\0\1\6" + "\1\0\5\6\1\127\2\6\6\0\32\6\1\0\2\6"
|
||||
+ "\11\0\1\6\1\0\6\6\1\200\1\6\6\0\32\6" + "\1\0\2\6\11\0\1\6\1\0\10\6\6\0\5\6"
|
||||
+ "\1\201\24\6\1\0\2\6\11\0\1\6\1\0\10\6" + "\6\0\5\6\1\202\24\6\1\0\2\6\11\0\1\6"
|
||||
+ "\1\0\5\6\1\203\2\6\6\0\32\6\1\0\2\6" + "\11\0\1\6\1\0\10\6\6\0\5\6\1\204\24\6"
|
||||
+ "\1\0\2\6\11\0\1\6\1\0\10\6\6\0\1\6" + "\1\205\30\6\1\0\2\6\11\0\1\6\1\0\1\167"
|
||||
+ "\7\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0" + "\10\6\6\0\16\6\1\206\13\6\1\0\2\6\11\0"
|
||||
+ "\1\207\1\0\10\6\6\0\32\6\1\0\2\6\11\0" + "\1\6\1\0\10\6\6\0\6\6\1\130\23\6\10\0"
|
||||
+ "\1\210\56\0\2\6\11\0\1\6\1\0\3\6\1\211" + "\4\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"
|
||||
+ "\1\212\7\6\6\0\32\6\1\0\2\6\11\0\1\6" + "\1\0\2\6\1\213\5\6\6\0\32\6\1\0\2\6"
|
||||
+ "\11\0\1\6\1\0\10\6\6\0\1\123\31\6\1\0" + "\2\6\11\0\1\6\1\0\3\6\1\135\4\6\6\0"
|
||||
+ "\32\6\1\0\2\6\11\0\1\6\1\0\2\6\1\214" + "\5\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"
|
||||
+ "\3\6\1\215\4\6\6\0\32\6\1\0\2\6\11\0" + "\1\6\1\0\2\6\1\216\5\6\6\0\32\6\1\0"
|
||||
+ "\2\6\11\0\1\6\1\0\3\6\1\217\3\6\1\220" + "\6\0\13\6\1\220\16\6\1\0\2\6\11\0\1\6"
|
||||
+ "\1\0\10\6\6\0\5\6\1\117\24\6\1\0\2\6" + "\11\0\1\6\1\0\5\6\1\221\2\6\6\0\32\6"
|
||||
+ "\1\0\2\6\11\0\1\6\1\0\10\6\6\0\2\6" + "\1\222\27\6\1\0\2\6\11\0\1\6\1\0\3\6"
|
||||
+ "\1\223\4\6\6\0\32\6\1\0\2\6\11\0\1\6" + "\1\0\10\6\6\0\6\6\1\224\23\6\1\0\2\6"
|
||||
+ "\11\0\1\6\1\0\7\6\1\145\6\0\32\6\1\0" + "\2\6\11\0\1\6\1\0\3\6\1\225\4\6\6\0"
|
||||
+ "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0" + "\1\6\1\226\30\6\1\0\2\6\11\0\1\6\1\0"
|
||||
+ "\5\6\1\117\2\6\6\0\32\6\1\0\2\6\11\0" + "\1\6\1\0\4\6\1\227\3\6\6\0\12\6\1\230"
|
||||
+ "\17\6\1\0\2\6\11\0\1\6\1\0\3\6\1\231" + "\4\6\6\0\32\6\22\0\1\232\62\0\1\233\114\0"
|
||||
+ "\1\234\65\0\1\235\20\0\2\6\11\0\1\6\1\0" + "\1\135\7\6\6\0\32\6\1\0\2\6\11\0\1\6"
|
||||
+ "\1\0\10\6\6\0\5\6\1\236\24\6\1\0\2\6" + "\11\0\1\6\1\0\5\6\1\237\2\6\6\0\32\6"
|
||||
+ "\1\0\2\6\11\0\1\6\1\0\6\6\1\240\1\6" + "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"
|
||||
+ "\6\0\1\175\31\6\1\0\2\6\11\0\1\6\1\0" + "\1\6\1\241\6\6\6\0\32\6\1\0\2\6\11\0"
|
||||
+ "\1\6\1\0\6\6\1\242\1\6\6\0\32\6\1\0" + "\2\6\11\0\1\6\1\0\6\6\1\243\1\6\6\0"
|
||||
+ "\32\6\1\0\2\6\11\0\1\6\1\0\2\6\1\236" + "\5\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"
|
||||
+ "\10\6\6\0\16\6\1\244\13\6\1\0\2\6\11\0" + "\1\6\1\0\10\6\6\0\22\6\1\245\7\6\1\0"
|
||||
+ "\2\6\11\0\1\6\1\0\1\6\1\246\6\6\6\0" + "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"
|
||||
+ "\12\6\1\247\17\6\1\0\2\6\11\0\1\6\1\0" + "\1\6\1\150\6\6\6\0\32\6\1\0\2\6\11\0"
|
||||
+ "\1\6\1\0\5\6\1\250\2\6\6\0\32\6\1\0" + "\2\6\11\0\1\6\1\0\10\6\6\0\5\6\1\251"
|
||||
+ "\24\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0" + "\30\6\1\252\1\6\1\0\2\6\11\0\1\6\1\0"
|
||||
+ "\3\6\1\175\4\6\6\0\32\6\1\0\2\6\11\0" + "\1\6\1\0\10\6\6\0\6\6\1\253\23\6\1\0"
|
||||
+ "\2\6\11\0\1\6\1\0\1\6\1\135\6\6\6\0" + "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"
|
||||
+ "\5\6\1\254\24\6\1\0\2\6\11\0\1\6\1\0" + "\1\255\7\6\6\0\32\6\1\0\2\6\11\0\1\6"
|
||||
+ "\1\0\1\6\1\175\6\6\6\0\32\6\1\0\2\6" + "\11\0\1\6\1\0\4\6\1\176\2\6\1\146\6\0"
|
||||
+ "\32\6\1\0\2\6\11\0\1\6\1\0\3\6\1\256" + "\4\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"
|
||||
+ "\3\6\1\257\4\6\6\0\32\6\1\0\2\6\11\0" + "\1\6\1\0\10\6\6\0\6\6\1\175\23\6\31\0"
|
||||
+ "\1\260\75\0\1\261\63\0\1\262\47\0\1\232\45\0" + "\2\6\11\0\1\6\1\0\6\6\1\151\1\6\6\0"
|
||||
+ "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0" + "\4\6\1\123\25\6\1\0\2\6\11\0\1\6\1\0"
|
||||
+ "\3\6\1\263\4\6\6\0\32\6\1\0\2\6\11\0" + "\1\6\1\0\7\6\1\135\6\0\32\6\1\0\2\6"
|
||||
+ "\11\0\1\6\1\0\6\6\1\135\1\6\6\0\32\6" + "\1\0\2\6\11\0\1\6\1\0\3\6\1\123\4\6"
|
||||
+ "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6" + "\6\0\23\6\1\264\6\6\1\0\2\6\11\0\1\6"
|
||||
+ "\1\0\10\6\6\0\5\6\1\265\24\6\1\0\2\6" + "\11\0\1\6\1\0\10\6\6\0\3\6\1\266\26\6"
|
||||
+ "\1\0\2\6\11\0\1\6\1\0\1\123\7\6\6\0" + "\32\6\1\0\2\6\11\0\1\6\1\0\1\6\1\151"
|
||||
+ "\6\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0" + "\2\6\1\267\5\6\6\0\32\6\1\0\2\6\11\0"
|
||||
+ "\1\6\1\0\10\6\6\0\4\6\1\135\25\6\1\0" + "\2\6\11\0\1\6\1\0\4\6\1\123\3\6\6\0"
|
||||
+ "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0" + "\5\6\1\270\24\6\1\0\2\6\11\0\1\6\1\0"
|
||||
+ "\10\6\6\0\1\271\31\6\1\0\2\6\11\0\1\6" + "\1\0\1\272\7\6\6\0\32\6\34\0\1\273\52\0"
|
||||
+ "\1\274\45\0\2\6\11\0\1\6\1\0\10\6\6\0" + "\6\6\1\275\23\6\1\0\2\6\11\0\1\6\1\0"
|
||||
+ "\10\6\6\0\24\6\1\276\5\6\1\0\2\6\11\0" + "\1\6\1\0\10\6\6\0\1\277\31\6\1\0\2\6"
|
||||
+ "\11\0\1\6\1\0\3\6\1\222\4\6\6\0\32\6" + "\1\0\2\6\11\0\1\6\1\0\5\6\1\242\2\6"
|
||||
+ "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6" + "\6\0\2\6\1\150\27\6\1\0\2\6\11\0\1\6"
|
||||
+ "\1\0\10\6\6\0\26\6\1\135\3\6\1\0\2\6" + "\11\0\1\6\1\0\5\6\1\300\2\6\6\0\32\6"
|
||||
+ "\47\0\1\232\35\0\1\232\47\0\2\6\11\0\1\6" + "\1\0\1\301\7\6\6\0\32\6\1\0\2\6\11\0"
|
||||
+ "\1\6\1\0\10\6\6\0\25\6\1\302\4\6\1\0" + "\2\6\11\0\1\6\1\0\10\6\6\0\13\6\1\135"
|
||||
+ "\16\6\1\0\2\6\11\0\1\6\1\0\1\303\7\6" + "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"
|
||||
+ "\6\0\13\6\1\304\16\6\1\0\2\6\11\0\1\6" + "\1\0\10\6\6\0\14\6\1\135\15\6\1\0\2\6"
|
||||
+ "\11\0\1\6\1\0\5\6\1\305\2\6\6\0\32\6" + "\1\0\2\6\11\0\1\6\1\0\5\6\1\306\2\6"
|
||||
+ "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6" + "\6\0\3\6\1\236\26\6\1\0\2\6\11\0\1\6"
|
||||
+ "\1\0\1\6\1\307\6\6\6\0\32\6\1\0\2\6" + "\11\0\1\6\1\0\10\6\6\0\3\6\1\310\26\6"
|
||||
+ "\1\0\2\6\11\0\1\6\1\0\5\6\1\311\2\6" + "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6" + "\6\0\13\6\1\151\16\6";
|
||||
|
||||
private static int[] zzUnpackTrans() {
|
||||
int[] result = new int[9720];
|
||||
int offset = 0;
|
||||
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackTrans(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
value--;
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/* error codes */
|
||||
private static final int ZZ_UNKNOWN_ERROR = 0;
|
||||
private static final int ZZ_NO_MATCH = 1;
|
||||
private static final int ZZ_PUSHBACK_2BIG = 2;
|
||||
/* error messages for the codes above */
|
||||
private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input",
|
||||
"Error: pushback value was too large" };
|
||||
/**
|
||||
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
|
||||
*/
|
||||
private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 = "\4\0\1\11\2\1\1\11\4\1\1\11\2\1\1\11"
|
||||
+ "\31\1\1\11\1\1\1\11\2\1\1\11\2\1\1\11" + "\2\1\2\11\23\1\3\0\23\1\2\11\2\1\1\0"
|
||||
+ "\24\1\4\0\13\1\1\11\21\1\4\0\22\1\1\11" + "\2\0\10\1\2\0\15\1";
|
||||
|
||||
private static int[] zzUnpackAttribute() {
|
||||
int[] result = new int[201];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAttribute(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/** the input device */
|
||||
private java.io.Reader zzReader;
|
||||
/** the current state of the DFA */
|
||||
private int zzState;
|
||||
/** the current lexical state */
|
||||
private int zzLexicalState = YYINITIAL;
|
||||
/**
|
||||
* this buffer contains the current text to be matched and is the source of the
|
||||
* yytext() string
|
||||
*/
|
||||
private char zzBuffer[];
|
||||
/** the textposition at the last accepting state */
|
||||
private int zzMarkedPos;
|
||||
/** the current text position in the buffer */
|
||||
private int zzCurrentPos;
|
||||
/** startRead marks the beginning of the yytext() string in the buffer */
|
||||
private int zzStartRead;
|
||||
/**
|
||||
* endRead marks the last character in the buffer, that has been read from input
|
||||
*/
|
||||
private int zzEndRead;
|
||||
/** zzAtEOF == true <=> the scanner is at the EOF */
|
||||
private boolean zzAtEOF;
|
||||
/* user code: */
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a no-parameter
|
||||
* constructor.
|
||||
*/
|
||||
public LuaTokenMaker() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos - 1, tokenType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start, end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "--", null };
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated from
|
||||
* <code>text</code>. This method must be implemented by subclasses so they can
|
||||
* correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing the syntax
|
||||
* highlighted text.
|
||||
*/
|
||||
@Override
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.COMMENT_MULTILINE:
|
||||
state = MLC;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = LONGSTRING;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos >= s.offset + s.count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream. Does not close the old
|
||||
* reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream <b>cannot</b> be
|
||||
* reused (internal buffer is discarded and lost). Lexical state is set to
|
||||
* <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill no longer
|
||||
* "refills" the buffer (since the way we do it, it's always "full" the first
|
||||
* time through, since it points to the segment's array). So, we assign
|
||||
* zzEndRead here.
|
||||
*/
|
||||
// zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner There is also a java.io.InputStream version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
public LuaTokenMaker(java.io.Reader in) {
|
||||
this.zzReader = in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner. There is also java.io.Reader version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Inputstream to read input from.
|
||||
*/
|
||||
public LuaTokenMaker(java.io.InputStream in) {
|
||||
this(new java.io.InputStreamReader(in));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unpacks the compressed character translation table.
|
||||
*
|
||||
* @param packed the packed character translation table
|
||||
* @return the unpacked character translation table
|
||||
*/
|
||||
private static char[] zzUnpackCMap(String packed) {
|
||||
char[] map = new char[0x10000];
|
||||
int i = 0; /* index in packed string */
|
||||
int j = 0; /* index in unpacked array */
|
||||
while (i < 164) {
|
||||
int count = packed.charAt(i++);
|
||||
char value = packed.charAt(i++);
|
||||
do
|
||||
map[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the input stream.
|
||||
*/
|
||||
public final void yyclose() throws java.io.IOException {
|
||||
zzAtEOF = true; /* indicate end of file */
|
||||
zzEndRead = zzStartRead; /* invalidate buffer */
|
||||
if (zzReader != null)
|
||||
zzReader.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current lexical state.
|
||||
*/
|
||||
public final int yystate() {
|
||||
return zzLexicalState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enters a new lexical state
|
||||
*
|
||||
* @param newState the new lexical state
|
||||
*/
|
||||
@Override
|
||||
public final void yybegin(int newState) {
|
||||
zzLexicalState = newState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the text matched by the current regular expression.
|
||||
*/
|
||||
public final String yytext() {
|
||||
return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character at position <tt>pos</tt> from the matched text.
|
||||
*
|
||||
* It is equivalent to yytext().charAt(pos), but faster
|
||||
*
|
||||
* @param pos the position of the character to fetch. A value from 0 to
|
||||
* yylength()-1.
|
||||
*
|
||||
* @return the character at position pos
|
||||
*/
|
||||
public final char yycharat(int pos) {
|
||||
return zzBuffer[zzStartRead + pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the length of the matched text region.
|
||||
*/
|
||||
public final int yylength() {
|
||||
return zzMarkedPos - zzStartRead;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports an error that occured while scanning.
|
||||
*
|
||||
* In a wellformed scanner (no or only correct usage of yypushback(int) and a
|
||||
* match-all fallback rule) this method will only be called with things that
|
||||
* "Can't Possibly Happen". If this method is called, something is seriously
|
||||
* wrong (e.g. a JFlex bug producing a faulty scanner etc.).
|
||||
*
|
||||
* Usual syntax/scanner level error handling should be done in error fallback
|
||||
* rules.
|
||||
*
|
||||
* @param errorCode the code of the errormessage to display
|
||||
*/
|
||||
private void zzScanError(int errorCode) {
|
||||
String message;
|
||||
try {
|
||||
message = ZZ_ERROR_MSG[errorCode];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
|
||||
}
|
||||
throw new Error(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes the specified amount of characters back into the input stream.
|
||||
*
|
||||
* They will be read again by then next call of the scanning method
|
||||
*
|
||||
* @param number the number of characters to be read again. This number must not
|
||||
* be greater than yylength()!
|
||||
*/
|
||||
public void yypushback(int number) {
|
||||
if (number > yylength())
|
||||
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||
zzMarkedPos -= number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resumes scanning until the next regular expression is matched, the end of
|
||||
* input is encountered or an I/O-Error occurs.
|
||||
*
|
||||
* @return the next token
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
|
||||
int zzInput;
|
||||
int zzAction;
|
||||
// cached fields:
|
||||
int zzCurrentPosL;
|
||||
int zzMarkedPosL;
|
||||
int zzEndReadL = zzEndRead;
|
||||
char[] zzBufferL = zzBuffer;
|
||||
char[] zzCMapL = ZZ_CMAP;
|
||||
int[] zzTransL = ZZ_TRANS;
|
||||
int[] zzRowMapL = ZZ_ROWMAP;
|
||||
int[] zzAttrL = ZZ_ATTRIBUTE;
|
||||
while (true) {
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzAction = -1;
|
||||
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
|
||||
zzState = zzLexicalState;
|
||||
zzForAction: {
|
||||
while (true) {
|
||||
if (zzCurrentPosL < zzEndReadL)
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
else if (zzAtEOF) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
// store back cached positions
|
||||
zzCurrentPos = zzCurrentPosL;
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
boolean eof = zzRefill();
|
||||
// get translated positions and possibly new buffer
|
||||
zzCurrentPosL = zzCurrentPos;
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzBufferL = zzBuffer;
|
||||
zzEndReadL = zzEndRead;
|
||||
if (eof) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
}
|
||||
}
|
||||
int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
|
||||
if (zzNext == -1)
|
||||
break zzForAction;
|
||||
zzState = zzNext;
|
||||
int zzAttributes = zzAttrL[zzState];
|
||||
if ((zzAttributes & 1) == 1) {
|
||||
zzAction = zzState;
|
||||
zzMarkedPosL = zzCurrentPosL;
|
||||
if ((zzAttributes & 8) == 8)
|
||||
break zzForAction;
|
||||
}
|
||||
}
|
||||
}
|
||||
// store back cached position
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||
case 3: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 24:
|
||||
break;
|
||||
case 13: {
|
||||
addToken(Token.LITERAL_CHAR);
|
||||
}
|
||||
case 25:
|
||||
break;
|
||||
case 15: {
|
||||
start = zzMarkedPos - 2;
|
||||
yybegin(LONGSTRING);
|
||||
}
|
||||
case 26:
|
||||
break;
|
||||
case 19: {
|
||||
yybegin(YYINITIAL);
|
||||
addToken(start, zzStartRead + 1, Token.COMMENT_MULTILINE);
|
||||
}
|
||||
case 27:
|
||||
break;
|
||||
case 4: {
|
||||
addToken(Token.WHITESPACE);
|
||||
}
|
||||
case 28:
|
||||
break;
|
||||
case 2: {
|
||||
addToken(Token.LITERAL_NUMBER_FLOAT);
|
||||
}
|
||||
case 29:
|
||||
break;
|
||||
case 17: {
|
||||
addToken(Token.RESERVED_WORD);
|
||||
}
|
||||
case 30:
|
||||
break;
|
||||
case 21: {
|
||||
start = zzMarkedPos - 4;
|
||||
yybegin(MLC);
|
||||
}
|
||||
case 31:
|
||||
break;
|
||||
case 7: {
|
||||
addToken(Token.SEPARATOR);
|
||||
}
|
||||
case 32:
|
||||
break;
|
||||
case 1: {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
case 33:
|
||||
break;
|
||||
case 18: {
|
||||
addToken(Token.FUNCTION);
|
||||
}
|
||||
case 34:
|
||||
break;
|
||||
case 5: {
|
||||
addToken(Token.ERROR_CHAR);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 35:
|
||||
break;
|
||||
case 6: {
|
||||
addToken(Token.ERROR_STRING_DOUBLE);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 36:
|
||||
break;
|
||||
case 23: {
|
||||
addToken(Token.DATA_TYPE);
|
||||
}
|
||||
case 37:
|
||||
break;
|
||||
case 22: {
|
||||
addToken(Token.LITERAL_BOOLEAN);
|
||||
}
|
||||
case 38:
|
||||
break;
|
||||
case 20: {
|
||||
yybegin(YYINITIAL);
|
||||
addToken(start, zzStartRead + 1, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
}
|
||||
case 39:
|
||||
break;
|
||||
case 14: {
|
||||
addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
}
|
||||
case 40:
|
||||
break;
|
||||
case 11: {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
return firstToken;
|
||||
}
|
||||
case 41:
|
||||
break;
|
||||
case 12: {
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
|
||||
return firstToken;
|
||||
}
|
||||
case 42:
|
||||
break;
|
||||
case 8: {
|
||||
addToken(Token.OPERATOR);
|
||||
}
|
||||
case 43:
|
||||
break;
|
||||
case 16: {
|
||||
start = zzMarkedPos - 2;
|
||||
yybegin(LINECOMMENT);
|
||||
}
|
||||
case 44:
|
||||
break;
|
||||
case 9: {
|
||||
}
|
||||
case 45:
|
||||
break;
|
||||
case 10: {
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_MULTILINE);
|
||||
return firstToken;
|
||||
}
|
||||
case 46:
|
||||
break;
|
||||
default:
|
||||
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
|
||||
zzAtEOF = true;
|
||||
switch (zzLexicalState) {
|
||||
case YYINITIAL: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 202:
|
||||
break;
|
||||
case LONGSTRING: {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
return firstToken;
|
||||
}
|
||||
case 203:
|
||||
break;
|
||||
case LINECOMMENT: {
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
|
||||
return firstToken;
|
||||
}
|
||||
case 204:
|
||||
break;
|
||||
case MLC: {
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_MULTILINE);
|
||||
return firstToken;
|
||||
}
|
||||
case 205:
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,333 +0,0 @@
|
||||
/*
|
||||
* 09/20/2008
|
||||
*
|
||||
* MakefileTokenMaker.java - Scanner for makefiles.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.Stack;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for makefiles.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>MakefileTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class MakefileTokenMaker
|
||||
%extends AbstractJFlexTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
private Stack<Boolean> varDepths;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public MakefileTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "#", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns whether tokens of the specified type should have "mark
|
||||
* occurrences" enabled for the current programming language.
|
||||
*
|
||||
* @param type The token type.
|
||||
* @return Whether tokens of this type should have "mark occurrences"
|
||||
* enabled.
|
||||
*/
|
||||
public boolean getMarkOccurrencesOfTokenType(int type) {
|
||||
return type==Token.IDENTIFIER || type==Token.VARIABLE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(Token.NULL);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Letter = [A-Za-z]
|
||||
Digit = [0-9]
|
||||
IdentifierStart = ({Letter}|[_\.])
|
||||
IdentifierPart = ({IdentifierStart}|{Digit})
|
||||
Identifier = ({IdentifierStart}{IdentifierPart}*)
|
||||
Label = ({Identifier}":")
|
||||
|
||||
CurlyVarStart = ("${")
|
||||
ParenVarStart = ("$(")
|
||||
|
||||
LineTerminator = (\n)
|
||||
WhiteSpace = ([ \t\f])
|
||||
|
||||
UnclosedCharLiteral = ([\']([^\'\n]|"\\'")*)
|
||||
CharLiteral = ({UnclosedCharLiteral}"'")
|
||||
UnclosedStringLiteral = ([\"]([^\"\n]|"\\\"")*)
|
||||
StringLiteral = ({UnclosedStringLiteral}[\"])
|
||||
UnclosedBacktickLiteral = ([\`]([^\`\n]|"\\`")*)
|
||||
BacktickLiteral = ({UnclosedBacktickLiteral}"`")
|
||||
|
||||
LineCommentBegin = "#"
|
||||
|
||||
IntegerLiteral = ({Digit}+)
|
||||
|
||||
Operator = ([\:\+\?]?"=")
|
||||
|
||||
|
||||
%state VAR
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
/* Keywords */
|
||||
"addprefix" |
|
||||
"addsuffix" |
|
||||
"basename" |
|
||||
"dir" |
|
||||
"filter" |
|
||||
"filter-out" |
|
||||
"findstring" |
|
||||
"firstword" |
|
||||
"foreach" |
|
||||
"join" |
|
||||
"notdir" |
|
||||
"origin" |
|
||||
"pathsubst" |
|
||||
"shell" |
|
||||
"sort" |
|
||||
"strip" |
|
||||
"suffix" |
|
||||
"wildcard" |
|
||||
"word" |
|
||||
"words" |
|
||||
"ifeq" |
|
||||
"ifneq" |
|
||||
"else" |
|
||||
"endif" |
|
||||
"define" |
|
||||
"endef" |
|
||||
"ifdef" |
|
||||
"ifndef" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
|
||||
{Label} { addToken(Token.PREPROCESSOR); }
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
{WhiteSpace}+ { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* String/Character literals. */
|
||||
{CharLiteral} { addToken(Token.LITERAL_CHAR); }
|
||||
{UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
|
||||
{StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
{UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
{BacktickLiteral} { addToken(Token.LITERAL_BACKQUOTE); }
|
||||
{BacktickLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
|
||||
/* Variables. */
|
||||
{CurlyVarStart} { if (varDepths==null) { varDepths = new Stack<Boolean>(); } else { varDepths.clear(); } varDepths.push(Boolean.TRUE); start = zzMarkedPos-2; yybegin(VAR); }
|
||||
{ParenVarStart} { if (varDepths==null) { varDepths = new Stack<Boolean>(); } else { varDepths.clear(); } varDepths.push(Boolean.FALSE); start = zzMarkedPos-2; yybegin(VAR); }
|
||||
|
||||
/* Comment literals. */
|
||||
{LineCommentBegin}.* { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
|
||||
/* Operators. */
|
||||
{Operator} { addToken(Token.OPERATOR); }
|
||||
|
||||
/* Numbers */
|
||||
{IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch-all for anything else. */
|
||||
. { addToken(Token.IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
<VAR> {
|
||||
[^\}\)\$\#]+ {}
|
||||
"}" {
|
||||
if (!varDepths.empty() && varDepths.peek()==Boolean.TRUE) {
|
||||
varDepths.pop();
|
||||
if (varDepths.empty()) {
|
||||
addToken(start,zzStartRead, Token.VARIABLE); yybegin(YYINITIAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
")" {
|
||||
if (!varDepths.empty() && varDepths.peek()==Boolean.FALSE) {
|
||||
varDepths.pop();
|
||||
if (varDepths.empty()) {
|
||||
addToken(start,zzStartRead, Token.VARIABLE); yybegin(YYINITIAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
"${" { varDepths.push(Boolean.TRUE); }
|
||||
"$(" { varDepths.push(Boolean.FALSE); }
|
||||
"$" {}
|
||||
"#".* { int temp1 = zzStartRead; int temp2 = zzMarkedPos; addToken(start,zzStartRead-1, Token.VARIABLE); addToken(temp1, temp2-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.VARIABLE); addNullToken(); return firstToken; }
|
||||
}
|
||||
@@ -1,782 +0,0 @@
|
||||
/* The following code was generated by JFlex 1.4.1 on 8/9/13 11:40 AM */
|
||||
/*
|
||||
* 09/20/2008
|
||||
* MakefileTokenMaker.java - Scanner for makefiles.
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
import java.util.Stack;
|
||||
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
|
||||
import org.fife.ui.rsyntaxtextarea.Token;
|
||||
import org.fife.ui.rsyntaxtextarea.TokenImpl;
|
||||
|
||||
/**
|
||||
* Scanner for makefiles.
|
||||
* <p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost completely
|
||||
* removed to be competitive with the handwritten lexers (subclasses of
|
||||
* <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around). We can
|
||||
* achieve this because RText always scans exactly 1 line of tokens at a time,
|
||||
* and hands the scanner this line as an array of characters (a Segment really).
|
||||
* Since tokens contain pointers to char arrays instead of Strings holding their
|
||||
* contents, there is no need for allocating new memory for Strings.
|
||||
* <p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.
|
||||
* <p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>MakefileTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>. You
|
||||
* should hand-delete the second of each definition (the ones generated by the
|
||||
* lexer), as these generated methods modify the input buffer, which we'll never
|
||||
* have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT be
|
||||
* initialized. This is a needless memory allocation for us since we will be
|
||||
* pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would with
|
||||
* any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
public class MakefileTokenMaker extends AbstractJFlexTokenMaker {
|
||||
|
||||
/** This character denotes the end of file */
|
||||
public static final int YYEOF = -1;
|
||||
/** lexical states */
|
||||
public static final int VAR = 1;
|
||||
public static final int YYINITIAL = 0;
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final String ZZ_CMAP_PACKED = "\11\0\1\10\1\7\1\0\1\10\23\0\1\10\1\0\1\13\1\15"
|
||||
+ "\1\4\2\0\1\11\1\6\1\47\1\0\1\16\1\0\1\37\1\1" + "\1\0\12\2\1\3\2\0\1\17\1\0\1\16\1\0\32\1\1\0"
|
||||
+ "\1\12\2\0\1\1\1\14\1\20\1\32\1\43\1\21\1\24\1\25" + "\1\41\1\44\1\26\1\45\1\1\1\35\1\34\1\33\1\40\1\22"
|
||||
+ "\1\46\1\23\1\30\1\36\1\31\1\1\1\42\1\27\2\1\1\5" + "\1\0\1\50\uff82\0";
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
|
||||
/**
|
||||
* Translates DFA states to action switch labels.
|
||||
*/
|
||||
private static final int[] ZZ_ACTION = zzUnpackAction();
|
||||
private static final String ZZ_ACTION_PACKED_0 = "\2\0\2\1\1\2\2\1\1\3\1\4\1\5\1\6"
|
||||
+ "\1\1\1\7\1\10\14\1\2\11\1\12\1\13\1\14" + "\1\15\1\16\1\17\1\20\1\5\1\6\1\21\2\0"
|
||||
+ "\1\22\23\1\1\23\1\24\1\20\1\21\1\22\2\1" + "\1\25\43\1\1\25\14\1\1\25\5\1\1\0\2\1" + "\1\0\1\1\1\0\1\25";
|
||||
|
||||
private static int[] zzUnpackAction() {
|
||||
int[] result = new int[129];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAction(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a state to a row index in the transition table
|
||||
*/
|
||||
private static final int[] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\51\0\122\0\173\0\244\0\315\0\366\0\122"
|
||||
+ "\0\u011f\0\u0148\0\u0171\0\u019a\0\u01c3\0\122\0\u01ec\0\u0215"
|
||||
+ "\0\u023e\0\u0267\0\u0290\0\u02b9\0\u02e2\0\u030b\0\u0334\0\u035d"
|
||||
+ "\0\u0386\0\u03af\0\u03d8\0\u0401\0\u042a\0\122\0\122\0\122"
|
||||
+ "\0\122\0\122\0\122\0\u0453\0\u047c\0\122\0\u019a\0\u04a5"
|
||||
+ "\0\122\0\u04ce\0\u04f7\0\u0520\0\u0549\0\u0572\0\u059b\0\u05c4"
|
||||
+ "\0\u05ed\0\u0616\0\u063f\0\u0668\0\u0691\0\u06ba\0\u06e3\0\u070c"
|
||||
+ "\0\u0735\0\u075e\0\u0787\0\u07b0\0\122\0\122\0\u0148\0\u0171"
|
||||
+ "\0\u019a\0\u07d9\0\u0802\0\173\0\u082b\0\u0854\0\u087d\0\u08a6"
|
||||
+ "\0\u08cf\0\u08f8\0\u0921\0\u094a\0\u0973\0\u099c\0\u09c5\0\u09ee"
|
||||
+ "\0\u0a17\0\u0a40\0\u0a69\0\u0a92\0\u0abb\0\u0ae4\0\u0b0d\0\u0b36"
|
||||
+ "\0\u0b5f\0\u0b88\0\u0bb1\0\u0bda\0\u0c03\0\u0c2c\0\u0c55\0\u0c7e"
|
||||
+ "\0\u0ca7\0\u0cd0\0\u0cf9\0\u0d22\0\u0d4b\0\u0d74\0\u0d9d\0\u0dc6"
|
||||
+ "\0\u0def\0\u0e18\0\u0e41\0\u0e6a\0\u0e93\0\u0ebc\0\u0ee5\0\u0f0e"
|
||||
+ "\0\u0f37\0\u0f60\0\u0f89\0\u0fb2\0\u0fdb\0\u1004\0\u102d\0\u1056"
|
||||
+ "\0\u107f\0\u10a8\0\u10d1\0\u10fa\0\u1123\0\u114c\0\u1175\0\u119e" + "\0\122";
|
||||
|
||||
private static int[] zzUnpackRowMap() {
|
||||
int[] result = new int[129];
|
||||
int offset = 0;
|
||||
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackRowMap(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int high = packed.charAt(i++) << 16;
|
||||
result[j++] = high | packed.charAt(i++);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* The transition table of the DFA
|
||||
*/
|
||||
private static final int[] ZZ_TRANS = zzUnpackTrans();
|
||||
private static final String ZZ_TRANS_PACKED_0 = "\1\3\1\4\1\5\1\6\1\7\2\3\1\10\1\11"
|
||||
+ "\1\12\1\3\1\13\1\14\1\15\1\6\1\16\1\17" + "\1\20\1\21\1\4\1\22\1\23\1\24\1\4\1\25"
|
||||
+ "\1\4\1\26\1\27\3\4\1\3\1\30\1\4\1\31" + "\2\4\1\32\1\4\2\3\4\33\1\34\10\33\1\35"
|
||||
+ "\31\33\1\36\1\37\52\0\2\4\1\40\14\0\17\4" + "\1\0\7\4\4\0\1\5\65\0\1\16\36\0\1\41"
|
||||
+ "\1\42\52\0\1\11\40\0\7\12\1\0\1\12\1\43" + "\1\44\36\12\7\13\1\0\2\13\1\45\1\46\35\13"
|
||||
+ "\7\47\1\0\2\47\1\50\1\47\1\51\34\47\7\15" + "\1\0\41\15\1\0\2\4\1\40\14\0\1\4\1\52"
|
||||
+ "\15\4\1\0\7\4\3\0\2\4\1\40\14\0\4\4" + "\1\53\1\4\1\54\10\4\1\0\7\4\3\0\2\4"
|
||||
+ "\1\40\14\0\1\55\16\4\1\0\7\4\3\0\2\4" + "\1\40\14\0\13\4\1\56\1\4\1\57\1\4\1\0"
|
||||
+ "\7\4\3\0\2\4\1\40\14\0\6\4\1\60\10\4" + "\1\0\1\61\6\4\3\0\2\4\1\40\14\0\5\4"
|
||||
+ "\1\62\11\4\1\0\7\4\3\0\2\4\1\40\14\0" + "\11\4\1\63\4\4\1\64\1\0\1\65\3\4\1\66"
|
||||
+ "\2\4\3\0\2\4\1\40\14\0\1\67\16\4\1\0" + "\7\4\3\0\2\4\1\40\14\0\17\4\1\0\1\70"
|
||||
+ "\6\4\3\0\2\4\1\40\14\0\3\4\1\71\13\4" + "\1\0\7\4\3\0\2\4\1\40\14\0\6\4\1\72"
|
||||
+ "\10\4\1\0\1\73\6\4\3\0\2\4\1\40\14\0" + "\17\4\1\0\1\74\6\4\2\0\4\33\1\0\10\33"
|
||||
+ "\1\0\31\33\7\0\1\75\1\76\42\0\7\35\1\0" + "\41\35\7\12\1\0\1\12\1\77\1\44\36\12\7\13"
|
||||
+ "\1\0\2\13\1\45\1\100\35\13\7\47\1\0\2\47" + "\1\50\1\47\1\101\34\47\1\0\2\4\1\40\14\0"
|
||||
+ "\1\4\1\102\15\4\1\0\7\4\3\0\2\4\1\40" + "\14\0\5\4\1\103\11\4\1\0\7\4\3\0\2\4"
|
||||
+ "\1\40\14\0\3\4\1\104\13\4\1\0\7\4\3\0" + "\2\4\1\40\14\0\16\4\1\105\1\0\7\4\3\0"
|
||||
+ "\2\4\1\40\14\0\1\4\1\106\15\4\1\0\7\4" + "\3\0\2\4\1\40\14\0\10\4\1\107\6\4\1\0"
|
||||
+ "\7\4\3\0\2\4\1\40\14\0\3\4\1\110\7\4" + "\1\111\1\4\1\112\1\4\1\0\7\4\3\0\2\4"
|
||||
+ "\1\40\14\0\3\4\1\113\13\4\1\0\7\4\3\0" + "\2\4\1\40\14\0\1\4\1\114\2\4\1\115\6\4"
|
||||
+ "\1\116\3\4\1\0\7\4\3\0\2\4\1\40\14\0" + "\5\4\1\117\11\4\1\0\7\4\3\0\2\4\1\40"
|
||||
+ "\14\0\3\4\1\120\13\4\1\0\7\4\3\0\2\4" + "\1\40\14\0\3\4\1\121\13\4\1\0\7\4\3\0"
|
||||
+ "\2\4\1\40\14\0\4\4\1\122\12\4\1\0\7\4" + "\3\0\2\4\1\40\14\0\10\4\1\123\6\4\1\0"
|
||||
+ "\7\4\3\0\2\4\1\40\14\0\16\4\1\124\1\0" + "\7\4\3\0\2\4\1\40\14\0\6\4\1\125\10\4"
|
||||
+ "\1\0\7\4\3\0\2\4\1\40\14\0\15\4\1\126" + "\1\4\1\0\7\4\3\0\2\4\1\40\14\0\3\4"
|
||||
+ "\1\127\13\4\1\0\7\4\3\0\2\4\1\40\14\0" + "\6\4\1\130\10\4\1\0\7\4\3\0\2\4\1\40"
|
||||
+ "\14\0\2\4\1\131\5\4\1\132\6\4\1\0\7\4" + "\3\0\2\4\1\40\14\0\6\4\1\133\10\4\1\0"
|
||||
+ "\7\4\3\0\2\4\1\40\14\0\17\4\1\0\4\4" + "\1\134\2\4\3\0\2\4\1\40\14\0\4\4\1\135"
|
||||
+ "\1\4\1\135\10\4\1\0\7\4\3\0\2\4\1\40" + "\14\0\4\4\1\104\12\4\1\0\7\4\3\0\2\4"
|
||||
+ "\1\40\14\0\10\4\1\136\6\4\1\0\7\4\3\0" + "\2\4\1\40\14\0\1\4\1\137\15\4\1\0\7\4"
|
||||
+ "\3\0\2\4\1\40\14\0\16\4\1\140\1\0\7\4" + "\3\0\2\4\1\40\14\0\4\4\1\141\12\4\1\0"
|
||||
+ "\7\4\3\0\2\4\1\40\14\0\4\4\1\135\12\4" + "\1\0\7\4\3\0\2\4\1\40\14\0\17\4\1\0"
|
||||
+ "\6\4\1\104\3\0\2\4\1\40\14\0\1\4\1\114" + "\2\4\1\115\12\4\1\0\7\4\3\0\2\4\1\40"
|
||||
+ "\14\0\5\4\1\142\11\4\1\0\7\4\3\0\2\4" + "\1\40\14\0\6\4\1\143\10\4\1\0\7\4\3\0"
|
||||
+ "\2\4\1\40\14\0\16\4\1\104\1\0\7\4\3\0" + "\2\4\1\40\14\0\15\4\1\144\1\4\1\0\7\4"
|
||||
+ "\3\0\2\4\1\40\14\0\4\4\1\145\12\4\1\0" + "\7\4\3\0\2\4\1\40\14\0\1\4\1\146\15\4"
|
||||
+ "\1\0\7\4\3\0\2\4\1\40\14\0\17\4\1\0" + "\1\4\1\74\5\4\3\0\2\4\1\40\14\0\1\4"
|
||||
+ "\1\147\15\4\1\0\7\4\3\0\2\4\1\40\14\0" + "\1\4\1\150\15\4\1\0\7\4\3\0\2\4\1\40"
|
||||
+ "\14\0\13\4\1\104\3\4\1\0\7\4\3\0\2\4" + "\1\40\14\0\3\4\1\151\13\4\1\0\7\4\3\0"
|
||||
+ "\2\4\1\40\14\0\11\4\1\63\5\4\1\0\7\4" + "\3\0\2\4\1\40\14\0\13\4\1\107\3\4\1\0"
|
||||
+ "\7\4\3\0\2\4\1\40\14\0\10\4\1\152\6\4" + "\1\0\7\4\3\0\2\4\1\40\14\0\5\4\1\104"
|
||||
+ "\11\4\1\0\7\4\3\0\2\4\1\40\14\0\16\4" + "\1\153\1\0\7\4\3\0\2\4\1\40\14\0\10\4"
|
||||
+ "\1\154\6\4\1\0\7\4\3\0\2\4\1\40\14\0" + "\4\4\1\155\12\4\1\0\7\4\3\0\2\4\1\40"
|
||||
+ "\14\0\1\156\16\4\1\0\7\4\3\0\2\4\1\40" + "\14\0\6\4\1\157\10\4\1\0\7\4\3\0\2\4"
|
||||
+ "\1\40\14\0\2\4\1\104\14\4\1\0\7\4\3\0" + "\2\4\1\40\14\0\15\4\1\104\1\4\1\0\7\4"
|
||||
+ "\3\0\2\4\1\40\14\0\13\4\1\160\3\4\1\0" + "\7\4\3\0\2\4\1\40\14\0\6\4\1\54\10\4"
|
||||
+ "\1\0\7\4\3\0\2\4\1\40\14\0\17\4\1\0" + "\3\4\1\161\3\4\3\0\2\4\1\40\14\0\10\4"
|
||||
+ "\1\104\6\4\1\0\7\4\3\0\2\4\1\40\14\0" + "\4\4\1\117\12\4\1\0\7\4\3\0\2\4\1\40"
|
||||
+ "\14\0\11\4\1\162\5\4\1\0\7\4\3\0\2\4" + "\1\40\14\0\17\4\1\0\2\4\1\163\4\4\3\0"
|
||||
+ "\2\4\1\40\14\0\16\4\1\164\1\0\7\4\3\0" + "\2\4\1\40\14\0\3\4\1\165\13\4\1\0\7\4"
|
||||
+ "\3\0\2\4\1\40\14\0\17\4\1\0\3\4\1\166" + "\3\4\3\0\2\4\1\40\14\0\7\4\1\104\7\4"
|
||||
+ "\1\0\7\4\3\0\2\4\1\40\14\0\1\167\16\4" + "\1\0\7\4\3\0\2\4\1\40\14\0\1\170\16\4"
|
||||
+ "\1\0\7\4\3\0\2\4\1\40\14\0\12\4\1\171" + "\4\4\1\0\7\4\3\0\2\4\1\40\14\0\17\4"
|
||||
+ "\1\0\1\170\6\4\3\0\2\4\1\40\14\0\3\4" + "\1\172\13\4\1\0\7\4\3\0\2\4\1\40\14\0"
|
||||
+ "\17\4\1\173\7\4\3\0\2\4\1\40\14\0\17\4" + "\1\0\4\4\1\104\2\4\3\0\2\4\1\40\14\0"
|
||||
+ "\14\4\1\107\2\4\1\0\7\4\3\0\2\4\1\40" + "\14\0\3\4\1\174\13\4\1\0\7\4\3\0\2\4"
|
||||
+ "\1\40\14\0\10\4\1\121\6\4\1\0\7\4\3\0" + "\2\4\1\40\14\0\6\4\1\175\10\4\1\0\7\4"
|
||||
+ "\42\0\1\176\11\0\2\4\1\40\14\0\1\4\1\104" + "\15\4\1\0\7\4\3\0\2\4\1\40\14\0\13\4"
|
||||
+ "\1\177\3\4\1\0\7\4\33\0\1\200\20\0\2\4" + "\1\40\14\0\17\4\1\0\1\4\1\104\5\4\40\0" + "\1\201\12\0";
|
||||
|
||||
private static int[] zzUnpackTrans() {
|
||||
int[] result = new int[4551];
|
||||
int offset = 0;
|
||||
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackTrans(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
value--;
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/* error codes */
|
||||
private static final int ZZ_UNKNOWN_ERROR = 0;
|
||||
private static final int ZZ_NO_MATCH = 1;
|
||||
private static final int ZZ_PUSHBACK_2BIG = 2;
|
||||
/* error messages for the codes above */
|
||||
private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input",
|
||||
"Error: pushback value was too large" };
|
||||
/**
|
||||
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
|
||||
*/
|
||||
private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 = "\2\0\1\11\4\1\1\11\5\1\1\11\17\1\6\11"
|
||||
+ "\2\1\1\11\2\0\1\11\23\1\2\11\74\1\1\0" + "\2\1\1\0\1\1\1\0\1\11";
|
||||
|
||||
private static int[] zzUnpackAttribute() {
|
||||
int[] result = new int[129];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAttribute(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/** the input device */
|
||||
private java.io.Reader zzReader;
|
||||
/** the current state of the DFA */
|
||||
private int zzState;
|
||||
/** the current lexical state */
|
||||
private int zzLexicalState = YYINITIAL;
|
||||
/**
|
||||
* this buffer contains the current text to be matched and is the source of the
|
||||
* yytext() string
|
||||
*/
|
||||
private char zzBuffer[];
|
||||
/** the textposition at the last accepting state */
|
||||
private int zzMarkedPos;
|
||||
/** the current text position in the buffer */
|
||||
private int zzCurrentPos;
|
||||
/** startRead marks the beginning of the yytext() string in the buffer */
|
||||
private int zzStartRead;
|
||||
/**
|
||||
* endRead marks the last character in the buffer, that has been read from input
|
||||
*/
|
||||
private int zzEndRead;
|
||||
/** zzAtEOF == true <=> the scanner is at the EOF */
|
||||
private boolean zzAtEOF;
|
||||
/* user code: */
|
||||
private Stack<Boolean> varDepths;
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a no-parameter
|
||||
* constructor.
|
||||
*/
|
||||
public MakefileTokenMaker() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos - 1, tokenType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start, end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "#", null };
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether tokens of the specified type should have "mark occurrences"
|
||||
* enabled for the current programming language.
|
||||
*
|
||||
* @param type The token type.
|
||||
* @return Whether tokens of this type should have "mark occurrences" enabled.
|
||||
*/
|
||||
@Override
|
||||
public boolean getMarkOccurrencesOfTokenType(int type) {
|
||||
return type == Token.IDENTIFIER || type == Token.VARIABLE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated from
|
||||
* <code>text</code>. This method must be implemented by subclasses so they can
|
||||
* correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing the syntax
|
||||
* highlighted text.
|
||||
*/
|
||||
@Override
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(Token.NULL);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos >= s.offset + s.count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream. Does not close the old
|
||||
* reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream <b>cannot</b> be
|
||||
* reused (internal buffer is discarded and lost). Lexical state is set to
|
||||
* <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill no longer
|
||||
* "refills" the buffer (since the way we do it, it's always "full" the first
|
||||
* time through, since it points to the segment's array). So, we assign
|
||||
* zzEndRead here.
|
||||
*/
|
||||
// zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner There is also a java.io.InputStream version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
public MakefileTokenMaker(java.io.Reader in) {
|
||||
this.zzReader = in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner. There is also java.io.Reader version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Inputstream to read input from.
|
||||
*/
|
||||
public MakefileTokenMaker(java.io.InputStream in) {
|
||||
this(new java.io.InputStreamReader(in));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unpacks the compressed character translation table.
|
||||
*
|
||||
* @param packed the packed character translation table
|
||||
* @return the unpacked character translation table
|
||||
*/
|
||||
private static char[] zzUnpackCMap(String packed) {
|
||||
char[] map = new char[0x10000];
|
||||
int i = 0; /* index in packed string */
|
||||
int j = 0; /* index in unpacked array */
|
||||
while (i < 126) {
|
||||
int count = packed.charAt(i++);
|
||||
char value = packed.charAt(i++);
|
||||
do
|
||||
map[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the input stream.
|
||||
*/
|
||||
public final void yyclose() throws java.io.IOException {
|
||||
zzAtEOF = true; /* indicate end of file */
|
||||
zzEndRead = zzStartRead; /* invalidate buffer */
|
||||
if (zzReader != null)
|
||||
zzReader.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current lexical state.
|
||||
*/
|
||||
public final int yystate() {
|
||||
return zzLexicalState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enters a new lexical state
|
||||
*
|
||||
* @param newState the new lexical state
|
||||
*/
|
||||
@Override
|
||||
public final void yybegin(int newState) {
|
||||
zzLexicalState = newState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the text matched by the current regular expression.
|
||||
*/
|
||||
public final String yytext() {
|
||||
return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character at position <tt>pos</tt> from the matched text.
|
||||
*
|
||||
* It is equivalent to yytext().charAt(pos), but faster
|
||||
*
|
||||
* @param pos the position of the character to fetch. A value from 0 to
|
||||
* yylength()-1.
|
||||
*
|
||||
* @return the character at position pos
|
||||
*/
|
||||
public final char yycharat(int pos) {
|
||||
return zzBuffer[zzStartRead + pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the length of the matched text region.
|
||||
*/
|
||||
public final int yylength() {
|
||||
return zzMarkedPos - zzStartRead;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports an error that occured while scanning.
|
||||
*
|
||||
* In a wellformed scanner (no or only correct usage of yypushback(int) and a
|
||||
* match-all fallback rule) this method will only be called with things that
|
||||
* "Can't Possibly Happen". If this method is called, something is seriously
|
||||
* wrong (e.g. a JFlex bug producing a faulty scanner etc.).
|
||||
*
|
||||
* Usual syntax/scanner level error handling should be done in error fallback
|
||||
* rules.
|
||||
*
|
||||
* @param errorCode the code of the errormessage to display
|
||||
*/
|
||||
private void zzScanError(int errorCode) {
|
||||
String message;
|
||||
try {
|
||||
message = ZZ_ERROR_MSG[errorCode];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
|
||||
}
|
||||
throw new Error(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes the specified amount of characters back into the input stream.
|
||||
*
|
||||
* They will be read again by then next call of the scanning method
|
||||
*
|
||||
* @param number the number of characters to be read again. This number must not
|
||||
* be greater than yylength()!
|
||||
*/
|
||||
public void yypushback(int number) {
|
||||
if (number > yylength())
|
||||
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||
zzMarkedPos -= number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resumes scanning until the next regular expression is matched, the end of
|
||||
* input is encountered or an I/O-Error occurs.
|
||||
*
|
||||
* @return the next token
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
|
||||
int zzInput;
|
||||
int zzAction;
|
||||
// cached fields:
|
||||
int zzCurrentPosL;
|
||||
int zzMarkedPosL;
|
||||
int zzEndReadL = zzEndRead;
|
||||
char[] zzBufferL = zzBuffer;
|
||||
char[] zzCMapL = ZZ_CMAP;
|
||||
int[] zzTransL = ZZ_TRANS;
|
||||
int[] zzRowMapL = ZZ_ROWMAP;
|
||||
int[] zzAttrL = ZZ_ATTRIBUTE;
|
||||
while (true) {
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzAction = -1;
|
||||
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
|
||||
zzState = zzLexicalState;
|
||||
zzForAction: {
|
||||
while (true) {
|
||||
if (zzCurrentPosL < zzEndReadL)
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
else if (zzAtEOF) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
// store back cached positions
|
||||
zzCurrentPos = zzCurrentPosL;
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
boolean eof = zzRefill();
|
||||
// get translated positions and possibly new buffer
|
||||
zzCurrentPosL = zzCurrentPos;
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzBufferL = zzBuffer;
|
||||
zzEndReadL = zzEndRead;
|
||||
if (eof) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
}
|
||||
}
|
||||
int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
|
||||
if (zzNext == -1)
|
||||
break zzForAction;
|
||||
zzState = zzNext;
|
||||
int zzAttributes = zzAttrL[zzState];
|
||||
if ((zzAttributes & 1) == 1) {
|
||||
zzAction = zzState;
|
||||
zzMarkedPosL = zzCurrentPosL;
|
||||
if ((zzAttributes & 8) == 8)
|
||||
break zzForAction;
|
||||
}
|
||||
}
|
||||
}
|
||||
// store back cached position
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||
case 13: {
|
||||
addToken(Token.PREPROCESSOR);
|
||||
}
|
||||
case 22:
|
||||
break;
|
||||
case 15: {
|
||||
if (varDepths == null) {
|
||||
varDepths = new Stack<Boolean>();
|
||||
} else {
|
||||
varDepths.clear();
|
||||
}
|
||||
varDepths.push(Boolean.FALSE);
|
||||
start = zzMarkedPos - 2;
|
||||
yybegin(VAR);
|
||||
}
|
||||
case 23:
|
||||
break;
|
||||
case 3: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 24:
|
||||
break;
|
||||
case 16: {
|
||||
addToken(Token.LITERAL_CHAR);
|
||||
}
|
||||
case 25:
|
||||
break;
|
||||
case 12: {
|
||||
if (!varDepths.empty() && varDepths.peek() == Boolean.TRUE) {
|
||||
varDepths.pop();
|
||||
if (varDepths.empty()) {
|
||||
addToken(start, zzStartRead, Token.VARIABLE);
|
||||
yybegin(YYINITIAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
case 26:
|
||||
break;
|
||||
case 11: {
|
||||
if (!varDepths.empty() && varDepths.peek() == Boolean.FALSE) {
|
||||
varDepths.pop();
|
||||
if (varDepths.empty()) {
|
||||
addToken(start, zzStartRead, Token.VARIABLE);
|
||||
yybegin(YYINITIAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
case 27:
|
||||
break;
|
||||
case 4: {
|
||||
addToken(Token.WHITESPACE);
|
||||
}
|
||||
case 28:
|
||||
break;
|
||||
case 21: {
|
||||
addToken(Token.RESERVED_WORD);
|
||||
}
|
||||
case 29:
|
||||
break;
|
||||
case 20: {
|
||||
varDepths.push(Boolean.FALSE);
|
||||
}
|
||||
case 30:
|
||||
break;
|
||||
case 18: {
|
||||
addToken(Token.LITERAL_BACKQUOTE);
|
||||
}
|
||||
case 31:
|
||||
break;
|
||||
case 19: {
|
||||
varDepths.push(Boolean.TRUE);
|
||||
}
|
||||
case 32:
|
||||
break;
|
||||
case 1: {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
case 33:
|
||||
break;
|
||||
case 14: {
|
||||
if (varDepths == null) {
|
||||
varDepths = new Stack<Boolean>();
|
||||
} else {
|
||||
varDepths.clear();
|
||||
}
|
||||
varDepths.push(Boolean.TRUE);
|
||||
start = zzMarkedPos - 2;
|
||||
yybegin(VAR);
|
||||
}
|
||||
case 34:
|
||||
break;
|
||||
case 5: {
|
||||
addToken(Token.ERROR_CHAR);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 35:
|
||||
break;
|
||||
case 6: {
|
||||
addToken(Token.ERROR_STRING_DOUBLE);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 36:
|
||||
break;
|
||||
case 10: {
|
||||
int temp1 = zzStartRead;
|
||||
int temp2 = zzMarkedPos;
|
||||
addToken(start, zzStartRead - 1, Token.VARIABLE);
|
||||
addToken(temp1, temp2 - 1, Token.COMMENT_EOL);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 37:
|
||||
break;
|
||||
case 17: {
|
||||
addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
}
|
||||
case 38:
|
||||
break;
|
||||
case 7: {
|
||||
addToken(Token.COMMENT_EOL);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 39:
|
||||
break;
|
||||
case 2: {
|
||||
addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
|
||||
}
|
||||
case 40:
|
||||
break;
|
||||
case 8: {
|
||||
addToken(Token.OPERATOR);
|
||||
}
|
||||
case 41:
|
||||
break;
|
||||
case 9: {
|
||||
}
|
||||
case 42:
|
||||
break;
|
||||
default:
|
||||
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
|
||||
zzAtEOF = true;
|
||||
switch (zzLexicalState) {
|
||||
case VAR: {
|
||||
addToken(start, zzStartRead - 1, Token.VARIABLE);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 130:
|
||||
break;
|
||||
case YYINITIAL: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 131:
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,813 +0,0 @@
|
||||
/*
|
||||
* 01/21/2011
|
||||
*
|
||||
* MxmlTokenMaker.java - Generates tokens for MXML syntax highlighting.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for MXML.
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>MXMLTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class MxmlTokenMaker
|
||||
%extends AbstractMarkupTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
/**
|
||||
* Type specific to JSPTokenMaker denoting a line ending with an unclosed
|
||||
* double-quote attribute.
|
||||
*/
|
||||
public static final int INTERNAL_ATTR_DOUBLE = -1;
|
||||
|
||||
|
||||
/**
|
||||
* Type specific to JSPTokenMaker denoting a line ending with an unclosed
|
||||
* single-quote attribute.
|
||||
*/
|
||||
public static final int INTERNAL_ATTR_SINGLE = -2;
|
||||
|
||||
|
||||
/**
|
||||
* Token type specific to this class; this signals that the user has
|
||||
* ended a line with an unclosed XML tag; thus a new line is beginning
|
||||
* still inside of the tag.
|
||||
*/
|
||||
public static final int INTERNAL_INTAG = -3;
|
||||
|
||||
/**
|
||||
* Token type specific to this class; this signals that the user has
|
||||
* ended a line with an unclosed Script tag; thus a new line is beginning
|
||||
* still inside of the tag.
|
||||
*/
|
||||
public static final int INTERNAL_INTAG_SCRIPT = -4;
|
||||
|
||||
/**
|
||||
* Token type specific to this class; this signals that the user has
|
||||
* ended a line in the middle of a double-quoted attribute in a Script
|
||||
* tag.
|
||||
*/
|
||||
public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
|
||||
|
||||
/**
|
||||
* Token type specific to this class; this signals that the user has
|
||||
* ended a line in the middle of a single-quoted attribute in a Script
|
||||
* tag.
|
||||
*/
|
||||
public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
|
||||
|
||||
/**
|
||||
* Token type specific to this class; this signals that the user has
|
||||
* ended a line in an ActionScript code block (text content inside a
|
||||
* Script tag).
|
||||
*/
|
||||
public static final int INTERNAL_IN_AS = -7;
|
||||
|
||||
/**
|
||||
* Token type specific to this class; this signals that the user has
|
||||
* ended a line in an MLC in an ActionScript code block (text content
|
||||
* inside a Script tag).
|
||||
*/
|
||||
public static final int INTERNAL_IN_AS_MLC = -8;
|
||||
|
||||
/**
|
||||
* Whether closing markup tags are automatically completed for HTML.
|
||||
*/
|
||||
private static boolean completeCloseTags;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public MxmlTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
static {
|
||||
completeCloseTags = true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens as an
|
||||
* "end token;" that is, at <code>zzMarkedPos</code>.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addEndToken(int tokenType) {
|
||||
addToken(zzMarkedPos,zzMarkedPos, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
* @param hyperlink Whether this token is a hyperlink.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType,
|
||||
int startOffset, boolean hyperlink) {
|
||||
super.addToken(array, start,end, tokenType, startOffset, hyperlink);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns whether markup close tags should be completed. For XML, the
|
||||
* default value is <code>true</code>.
|
||||
*
|
||||
* @return Whether closing markup tags are completed.
|
||||
* @see #setCompleteCloseTags(boolean)
|
||||
*/
|
||||
@Override
|
||||
public boolean getCompleteCloseTags() {
|
||||
return completeCloseTags;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Static version of {@link #getCompleteCloseTags()}. This hack is
|
||||
* unfortunately needed for applications to be able to query this value
|
||||
* without instantiating this class.
|
||||
*
|
||||
* @return Whether closing markup tags are completed.
|
||||
* @see #setCompleteCloseTags(boolean)
|
||||
*/
|
||||
public static boolean getCompleteCloseMarkupTags() {
|
||||
return completeCloseTags;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Always returns <code>false</code>, as you never want "mark occurrences"
|
||||
* working in XML files.
|
||||
*
|
||||
* @param type The token type.
|
||||
* @return Whether tokens of this type should have "mark occurrences"
|
||||
* enabled.
|
||||
*/
|
||||
public boolean getMarkOccurrencesOfTokenType(int type) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.MARKUP_COMMENT:
|
||||
state = COMMENT;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.MARKUP_DTD:
|
||||
state = DTD;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_ATTR_DOUBLE:
|
||||
state = INATTR_DOUBLE;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_ATTR_SINGLE:
|
||||
state = INATTR_SINGLE;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.MARKUP_PROCESSING_INSTRUCTION:
|
||||
state = PI;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_INTAG:
|
||||
state = INTAG;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_INTAG_SCRIPT:
|
||||
state = INTAG_SCRIPT;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
|
||||
state = INATTR_DOUBLE_SCRIPT;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
|
||||
state = INATTR_SINGLE_SCRIPT;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_IN_AS:
|
||||
state = AS;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_IN_AS_MLC:
|
||||
state = AS_MLC;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.MARKUP_CDATA:
|
||||
state = CDATA;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets whether markup close tags should be completed.
|
||||
*
|
||||
* @param complete Whether closing markup tags are completed.
|
||||
* @see #getCompleteCloseTags()
|
||||
*/
|
||||
public static void setCompleteCloseTags(boolean complete) {
|
||||
completeCloseTags = complete;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <code>YY_INITIAL</code>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
/* XML macros (and some building-block macros used by AS macros). */
|
||||
Letter = [A-Za-z]
|
||||
NonzeroDigit = [1-9]
|
||||
Digit = ("0"|{NonzeroDigit})
|
||||
LetterOrUnderscore = ({Letter}|"_")
|
||||
NameStartChar = ({Letter}|[\:])
|
||||
NameChar = ({NameStartChar}|[\-\.]|{Digit})
|
||||
TagName = ({NameStartChar}{NameChar}*)
|
||||
Whitespace = ([ \t\f])
|
||||
LineTerminator = ([\n])
|
||||
Identifier = ([^ \t\n<&]+)
|
||||
EntityReference = ([&][^; \t]*[;]?)
|
||||
InTagIdentifier = ([^ \t\n\"\'=\/>]+)
|
||||
CDataBegin = ("<![CDATA[")
|
||||
CDataEnd = ("]]>")
|
||||
|
||||
|
||||
/* ActionScript macros. */
|
||||
HexDigit = ({Digit}|[A-Fa-f])
|
||||
OctalDigit = ([0-7])
|
||||
AnyCharacterButApostropheOrBackSlash = ([^\\'])
|
||||
AnyCharacterButDoubleQuoteOrBackSlash = ([^\\\"\n])
|
||||
EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
|
||||
Escape = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
|
||||
NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
|
||||
IdentifierStart = ({LetterOrUnderscore}|"$")
|
||||
IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
|
||||
|
||||
AS_CharLiteral = ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})*[\'])
|
||||
AS_UnclosedCharLiteral = ([\']([\\].|[^\\\'])*[^\']?)
|
||||
AS_ErrorCharLiteral = ({AS_UnclosedCharLiteral}[\'])
|
||||
AS_StringLiteral = ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
|
||||
AS_UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
|
||||
AS_ErrorStringLiteral = ({AS_UnclosedStringLiteral}[\"])
|
||||
|
||||
AS_MLCBegin = ("/*")
|
||||
AS_MLCEnd = ("*/")
|
||||
AS_LineCommentBegin = ("//")
|
||||
IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
|
||||
IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
|
||||
AS_IntegerLiteral = ({IntegerHelper1}[lL]?)
|
||||
AS_HexLiteral = ({IntegerHelper2}[lL]?)
|
||||
FloatHelper1 = ([fFdD]?)
|
||||
FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
|
||||
FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
|
||||
FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
|
||||
FloatLiteral3 = ({Digit}+{FloatHelper2})
|
||||
AS_FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
|
||||
AS_ErrorNumberFormat = (({AS_IntegerLiteral}|{AS_HexLiteral}|{AS_FloatLiteral}){NonSeparator}+)
|
||||
AS_BooleanLiteral = ("true"|"false")
|
||||
|
||||
AS_Separator = ([\(\)\{\}\[\]])
|
||||
AS_Separator2 = ([\;,.])
|
||||
|
||||
NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
|
||||
AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
|
||||
AS_Operator = ({NonAssignmentOperator}|{AssignmentOperator})
|
||||
|
||||
AS_Identifier = ({IdentifierStart}{IdentifierPart}*)
|
||||
AS_ErrorIdentifier = ({NonSeparator}+)
|
||||
AS_EndScriptTag = ("</"({NameStartChar}{NameChar}*":")?"Script"{Whitespace}*">")
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$]|{Letter}|{Digit})
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
%state COMMENT
|
||||
%state PI
|
||||
%state DTD
|
||||
%state INTAG
|
||||
%state INATTR_DOUBLE
|
||||
%state INATTR_SINGLE
|
||||
%state INTAG_SCRIPT
|
||||
%state INATTR_DOUBLE_SCRIPT
|
||||
%state INATTR_SINGLE_SCRIPT
|
||||
%state CDATA
|
||||
|
||||
%state AS
|
||||
%state AS_MLC
|
||||
%state AS_EOL_COMMENT
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
"<!--" { start = zzMarkedPos-4; yybegin(COMMENT); }
|
||||
{CDataBegin} { addToken(Token.MARKUP_CDATA_DELIMITER); start = zzMarkedPos; yybegin(CDATA); }
|
||||
"<!" { start = zzMarkedPos-2; yybegin(DTD); }
|
||||
"<?" { start = zzMarkedPos-2; yybegin(PI); }
|
||||
"<"{TagName} {
|
||||
int count = yylength();
|
||||
String tag = yytext(); // Get before addToken calls
|
||||
addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
|
||||
addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
|
||||
if (tag.endsWith(":Script") || tag.equals("<Script")) {
|
||||
yybegin(INTAG_SCRIPT);
|
||||
}
|
||||
else {
|
||||
yybegin(INTAG);
|
||||
}
|
||||
}
|
||||
"</"{TagName} {
|
||||
int count = yylength();
|
||||
addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
|
||||
addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
|
||||
yybegin(INTAG);
|
||||
}
|
||||
"<" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
|
||||
"</" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
{EntityReference} { addToken(Token.MARKUP_ENTITY_REFERENCE); }
|
||||
{Whitespace}+ { addToken(Token.WHITESPACE); }
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
}
|
||||
|
||||
<COMMENT> {
|
||||
[^hwf\n\-]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
"-->" { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); }
|
||||
"-" {}
|
||||
{LineTerminator} |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken; }
|
||||
}
|
||||
|
||||
<PI> {
|
||||
[^\n\?]+ {}
|
||||
{LineTerminator} { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
|
||||
"?>" { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION); }
|
||||
"?" {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
|
||||
}
|
||||
|
||||
<DTD> {
|
||||
[^\n>]+ {}
|
||||
{LineTerminator} { addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken; }
|
||||
">" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken; }
|
||||
}
|
||||
|
||||
<INTAG> {
|
||||
{InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
|
||||
{Whitespace}+ { addToken(Token.WHITESPACE); }
|
||||
"=" { addToken(Token.OPERATOR); }
|
||||
"/" { addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */ }
|
||||
"/>" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
|
||||
">" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
|
||||
[\"] { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
|
||||
[\'] { start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, INTERNAL_INTAG); return firstToken; }
|
||||
}
|
||||
|
||||
<INATTR_DOUBLE> {
|
||||
[^\"]* {}
|
||||
[\"] { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
|
||||
}
|
||||
|
||||
<INATTR_SINGLE> {
|
||||
[^\']* {}
|
||||
[\'] { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
|
||||
}
|
||||
|
||||
<INTAG_SCRIPT> {
|
||||
{InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
|
||||
{Whitespace}+ { addToken(Token.WHITESPACE); }
|
||||
"=" { addToken(Token.OPERATOR); }
|
||||
"/" { addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */ }
|
||||
"/>" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
|
||||
">" { yybegin(AS); addToken(Token.MARKUP_TAG_DELIMITER); }
|
||||
[\"] { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT); }
|
||||
[\'] { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, INTERNAL_INTAG_SCRIPT); return firstToken; }
|
||||
}
|
||||
|
||||
<INATTR_DOUBLE_SCRIPT> {
|
||||
[^\"]* {}
|
||||
[\"] { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken; }
|
||||
}
|
||||
|
||||
<INATTR_SINGLE_SCRIPT> {
|
||||
[^\']* {}
|
||||
[\'] { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken; }
|
||||
}
|
||||
|
||||
<CDATA> {
|
||||
[^\]]+ {}
|
||||
{CDataEnd} { int temp=zzStartRead; yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addToken(temp,zzMarkedPos-1, Token.MARKUP_CDATA_DELIMITER); }
|
||||
"]" {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_CDATA); return firstToken; }
|
||||
}
|
||||
|
||||
<AS> {
|
||||
|
||||
{AS_EndScriptTag} {
|
||||
int origStart = zzStartRead;
|
||||
String text = yytext();
|
||||
int tagNameEnd = text.length() - 2; // "-1" is '>'
|
||||
while (Character.isWhitespace(text.charAt(tagNameEnd))) {
|
||||
tagNameEnd--;
|
||||
}
|
||||
int tagNameLen = tagNameEnd - 1;
|
||||
yybegin(YYINITIAL);
|
||||
addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
|
||||
addToken(origStart+2,origStart+2+tagNameLen-1, Token.MARKUP_TAG_NAME);
|
||||
if (tagNameEnd<text.length()-2) {
|
||||
addToken(origStart+tagNameEnd+1, zzMarkedPos-2, Token.WHITESPACE);
|
||||
}
|
||||
addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
|
||||
}
|
||||
|
||||
/* ActionScript snippets are usually wrapped in CDATA. */
|
||||
{CDataBegin} |
|
||||
{CDataEnd} { addToken(Token.MARKUP_CDATA_DELIMITER); }
|
||||
|
||||
/* Keywords */
|
||||
"add" |
|
||||
"and" |
|
||||
"break" |
|
||||
"case" |
|
||||
"catch" |
|
||||
"class" |
|
||||
"const" |
|
||||
"continue" |
|
||||
"default" |
|
||||
"delete" |
|
||||
"do" |
|
||||
"dynamic" |
|
||||
"else" |
|
||||
"eq" |
|
||||
"extends" |
|
||||
"final" |
|
||||
"finally" |
|
||||
"for" |
|
||||
"for each" |
|
||||
"function" |
|
||||
"ge" |
|
||||
"get" |
|
||||
"gt" |
|
||||
"if" |
|
||||
"ifFrameLoaded" |
|
||||
"implements" |
|
||||
"import" |
|
||||
"in" |
|
||||
"include" |
|
||||
"interface" |
|
||||
"internal" |
|
||||
"label" |
|
||||
"le" |
|
||||
"lt" |
|
||||
"namespace" |
|
||||
"native" |
|
||||
"ne" |
|
||||
"new" |
|
||||
"not" |
|
||||
"on" |
|
||||
"onClipEvent" |
|
||||
"or" |
|
||||
"override" |
|
||||
"package" |
|
||||
"private" |
|
||||
"protected" |
|
||||
"public" |
|
||||
"return" |
|
||||
"set" |
|
||||
"static" |
|
||||
"super" |
|
||||
"switch" |
|
||||
"tellTarget" |
|
||||
"this" |
|
||||
"throw" |
|
||||
"try" |
|
||||
"typeof" |
|
||||
"use" |
|
||||
"var" |
|
||||
"void" |
|
||||
"while" |
|
||||
"with" |
|
||||
|
||||
"null" |
|
||||
"undefined" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
/* Built-in objects (good idea not to use these names!) */
|
||||
"Array" |
|
||||
"Boolean" |
|
||||
"Color" |
|
||||
"Date" |
|
||||
"Function" |
|
||||
"int" |
|
||||
"Key" |
|
||||
"MovieClip" |
|
||||
"Math" |
|
||||
"Mouse" |
|
||||
"Null" |
|
||||
"Number" |
|
||||
"Object" |
|
||||
"Selection" |
|
||||
"Sound" |
|
||||
"String" |
|
||||
"uint" |
|
||||
"Vector" |
|
||||
"void" |
|
||||
"XML" |
|
||||
"XMLNode" |
|
||||
"XMLSocket" { addToken(Token.DATA_TYPE); }
|
||||
|
||||
/* Global functions */
|
||||
"call" |
|
||||
"escape" |
|
||||
"eval" |
|
||||
"fscommand" |
|
||||
"getProperty" |
|
||||
"getTimer" |
|
||||
"getURL" |
|
||||
"getVersion" |
|
||||
"gotoAndPlay" |
|
||||
"gotoAndStop" |
|
||||
"#include" |
|
||||
"int" |
|
||||
"isFinite" |
|
||||
"isNaN" |
|
||||
"loadMovie" |
|
||||
"loadMovieNum" |
|
||||
"loadVariables" |
|
||||
"loadVariablesNum" |
|
||||
"maxscroll" |
|
||||
"newline" |
|
||||
"nextFrame" |
|
||||
"nextScene" |
|
||||
"Number" |
|
||||
"parseFloat" |
|
||||
"parseInt" |
|
||||
"play" |
|
||||
"prevFrame" |
|
||||
"prevScene" |
|
||||
"print" |
|
||||
"printAsBitmap" |
|
||||
"printAsBitmapNum" |
|
||||
"printNum" |
|
||||
"random" |
|
||||
"removeMovieClip" |
|
||||
"scroll" |
|
||||
"setProperty" |
|
||||
"startDrag" |
|
||||
"stop" |
|
||||
"stopAllSounds" |
|
||||
"stopDrag" |
|
||||
"String" |
|
||||
"targetPath" |
|
||||
"tellTarget" |
|
||||
"toggleHighQuality" |
|
||||
"trace" |
|
||||
"unescape" |
|
||||
"unloadMovie" |
|
||||
"unloadMovieNum" |
|
||||
"updateAfterEvent" { addToken(Token.FUNCTION); }
|
||||
|
||||
/* Booleans. */
|
||||
{AS_BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
|
||||
|
||||
{LineTerminator} { addEndToken(INTERNAL_IN_AS); return firstToken; }
|
||||
|
||||
{AS_Identifier} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
{Whitespace}+ { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* String/Character literals. */
|
||||
{AS_CharLiteral} { addToken(Token.LITERAL_CHAR); }
|
||||
{AS_UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
|
||||
{AS_ErrorCharLiteral} { addToken(Token.ERROR_CHAR); }
|
||||
{AS_StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
{AS_UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
{AS_ErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
|
||||
|
||||
/* Comment literals. */
|
||||
"/**/" { addToken(Token.COMMENT_MULTILINE); }
|
||||
{AS_MLCBegin} { start = zzMarkedPos-2; yybegin(AS_MLC); }
|
||||
{AS_LineCommentBegin} { start = zzMarkedPos-2; yybegin(AS_EOL_COMMENT); }
|
||||
|
||||
/* Separators. */
|
||||
{AS_Separator} { addToken(Token.SEPARATOR); }
|
||||
{AS_Separator2} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
/* Operators. */
|
||||
{AS_Operator} { addToken(Token.OPERATOR); }
|
||||
|
||||
/* Numbers */
|
||||
{AS_IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{AS_HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
|
||||
{AS_FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
{AS_ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
|
||||
|
||||
{AS_ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addEndToken(INTERNAL_IN_AS); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters and flag them as bad. */
|
||||
. { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<AS_MLC> {
|
||||
|
||||
[^hwf\n\*]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_AS_MLC); return firstToken; }
|
||||
{AS_MLCEnd} { yybegin(AS); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
|
||||
\* {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_AS_MLC); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<AS_EOL_COMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_AS); return firstToken; }
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,742 +0,0 @@
|
||||
/*
|
||||
* 07/14/2014
|
||||
*
|
||||
* NSISTokenMaker.java - Scanner for NSIS installer scripts.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for NSIS installer scripts.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>NSISTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 1.0
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class NSISTokenMaker
|
||||
%extends AbstractJFlexCTokenMaker
|
||||
%unicode
|
||||
%ignorecase
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public NSISTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addHyperlinkToken(int, int, int)
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
* @param hyperlink Whether this token is a hyperlink.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType,
|
||||
int startOffset, boolean hyperlink) {
|
||||
super.addToken(array, start,end, tokenType, startOffset, hyperlink);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "#", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = YYINITIAL;
|
||||
switch (initialTokenType) {
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = STRING;
|
||||
break;
|
||||
case Token.LITERAL_CHAR:
|
||||
state = CHAR_LITERAL;
|
||||
break;
|
||||
case Token.LITERAL_BACKQUOTE:
|
||||
state = BACKTICKS;
|
||||
break;
|
||||
case Token.COMMENT_MULTILINE:
|
||||
state = MLC;
|
||||
break;
|
||||
}
|
||||
|
||||
start = text.offset;
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Letter = ([A-Za-z])
|
||||
LetterOrUnderscore = ({Letter}|"_")
|
||||
NonzeroDigit = ([1-9])
|
||||
Digit = ("0"|{NonzeroDigit})
|
||||
HexDigit = ({Digit}|[A-Fa-f])
|
||||
OctalDigit = ([0-7])
|
||||
EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
|
||||
NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
|
||||
IdentifierStart = ({LetterOrUnderscore}|[$/])
|
||||
IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
|
||||
|
||||
LineTerminator = (\n)
|
||||
WhiteSpace = ([ \t\f])
|
||||
|
||||
MLCBegin = ("/*")
|
||||
MLCEnd = ("*/")
|
||||
LineCommentBegin = ([;#])
|
||||
|
||||
IntegerLiteral = (({NonzeroDigit}{Digit}*)|"0")
|
||||
HexLiteral = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
|
||||
ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}){NonSeparator}+)
|
||||
BooleanLiteral = ("true"|"false")
|
||||
|
||||
Separator = ([\(\)\{\}\[\]])
|
||||
Separator2 = ([\;,.])
|
||||
|
||||
NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&")
|
||||
AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>=")
|
||||
Operator = ({NonAssignmentOperator}|{AssignmentOperator})
|
||||
|
||||
Identifier = ({IdentifierStart}{IdentifierPart}*)
|
||||
VariableStart = ("$")
|
||||
Variable = ({VariableStart}({Identifier}|"{"{Identifier}"}"))
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$]|{Letter}|{Digit})
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
|
||||
%state STRING
|
||||
%state CHAR_LITERAL
|
||||
%state BACKTICKS
|
||||
%state MLC
|
||||
%state EOL_COMMENT
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
/* Keywords */
|
||||
"function" |
|
||||
"functionend" |
|
||||
"section" |
|
||||
"sectionend" |
|
||||
"subsection" |
|
||||
"subsectionend" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
/* Instructions */
|
||||
"addbrandingimage" |
|
||||
"addsize" |
|
||||
"allowrootdirinstall" |
|
||||
"allowskipfiles" |
|
||||
"autoclosewindow" |
|
||||
"bggradient" |
|
||||
"brandingtext" |
|
||||
"bringtofront" |
|
||||
"callinstdll" |
|
||||
"caption" |
|
||||
"changeui" |
|
||||
"checkbitmap" |
|
||||
"completedtext" |
|
||||
"componenttext" |
|
||||
"copyfiles" |
|
||||
"crccheck" |
|
||||
"createdirectory" |
|
||||
"createfont" |
|
||||
"createshortcut" |
|
||||
"delete" |
|
||||
"deleteinisec" |
|
||||
"deleteinistr" |
|
||||
"deleteregkey" |
|
||||
"deleteregvalue" |
|
||||
"detailprint" |
|
||||
"detailsbuttontext" |
|
||||
"dirshow" |
|
||||
"dirtext" |
|
||||
"enumregkey" |
|
||||
"enumregvalue" |
|
||||
"exch" |
|
||||
"exec" |
|
||||
"execshell" |
|
||||
"execwait" |
|
||||
"expandenvstrings" |
|
||||
"file" |
|
||||
"fileclose" |
|
||||
"fileerrortext" |
|
||||
"fileopen" |
|
||||
"fileread" |
|
||||
"filereadbyte" |
|
||||
"fileseek" |
|
||||
"filewrite" |
|
||||
"filewritebyte" |
|
||||
"findclose" |
|
||||
"findfirst" |
|
||||
"findnext" |
|
||||
"findwindow" |
|
||||
"flushini" |
|
||||
"getcurinsttype" |
|
||||
"getcurrentaddress" |
|
||||
"getdlgitem" |
|
||||
"getdllversion" |
|
||||
"getdllversionlocal" |
|
||||
"getfiletime" |
|
||||
"getfiletimelocal" |
|
||||
"getfullpathname" |
|
||||
"getfunctionaddress" |
|
||||
"getlabeladdress" |
|
||||
"gettempfilename" |
|
||||
"getwindowtext" |
|
||||
"hidewindow" |
|
||||
"icon" |
|
||||
"initpluginsdir" |
|
||||
"installbuttontext" |
|
||||
"installcolors" |
|
||||
"installdir" |
|
||||
"installdirregkey" |
|
||||
"instprogressflags" |
|
||||
"insttype" |
|
||||
"insttypegettext" |
|
||||
"insttypesettext" |
|
||||
"intfmt" |
|
||||
"intop" |
|
||||
"langstring" |
|
||||
"langstringup" |
|
||||
"licensebkcolor" |
|
||||
"licensedata" |
|
||||
"licenseforceselection" |
|
||||
"licensetext" |
|
||||
"loadlanguagefile" |
|
||||
"loadlanguagefile" |
|
||||
"logset" |
|
||||
"logtext" |
|
||||
"miscbuttontext" |
|
||||
"name" |
|
||||
"nop" |
|
||||
"outfile" |
|
||||
"page" |
|
||||
"plugindir" |
|
||||
"pop" |
|
||||
"push" |
|
||||
"readenvstr" |
|
||||
"readinistr" |
|
||||
"readregdword" |
|
||||
"readregstr" |
|
||||
"regdll" |
|
||||
"rename" |
|
||||
"requestexecutionlevel" |
|
||||
"reservefile" |
|
||||
"rmdir" |
|
||||
"searchpath" |
|
||||
"sectiongetflags" |
|
||||
"sectiongetinsttypes" |
|
||||
"sectiongetsize" |
|
||||
"sectiongettext" |
|
||||
"sectionin" |
|
||||
"sectionsetflags" |
|
||||
"sectionsetinsttypes" |
|
||||
"sectionsetsize" |
|
||||
"sectionsettext" |
|
||||
"sendmessage" |
|
||||
"setautoclose" |
|
||||
"setbkcolor" |
|
||||
"setbrandingimage" |
|
||||
"setcompress" |
|
||||
"setcompressor" |
|
||||
"setcurinsttype" |
|
||||
"setdatablockoptimize" |
|
||||
"setdatesave" |
|
||||
"setdetailsprint" |
|
||||
"setdetailsview" |
|
||||
"setfileattributes" |
|
||||
"setfont" |
|
||||
"setoutpath" |
|
||||
"setoverwrite" |
|
||||
"setpluginunload" |
|
||||
"setrebootflag" |
|
||||
"setshellvarcontext" |
|
||||
"setstaticbkcolor" |
|
||||
"setwindowlong" |
|
||||
"showinstdetails" |
|
||||
"showuninstdetails" |
|
||||
"showwindow" |
|
||||
"silentinstall" |
|
||||
"silentuninstall" |
|
||||
"sleep" |
|
||||
"spacetexts" |
|
||||
"strcpy" |
|
||||
"strlen" |
|
||||
"subcaption" |
|
||||
"uninstallbuttontext" |
|
||||
"uninstallcaption" |
|
||||
"uninstallicon" |
|
||||
"uninstallsubcaption" |
|
||||
"uninstalltext" |
|
||||
"uninstpage" |
|
||||
"unregdll" |
|
||||
"var" |
|
||||
"viaddversionkey" |
|
||||
"videscription" |
|
||||
"vicompanyname" |
|
||||
"vicomments" |
|
||||
"vilegalcopyrights" |
|
||||
"vilegaltrademarks" |
|
||||
"viproductname" |
|
||||
"viproductversion" |
|
||||
"windowicon" |
|
||||
"writeinistr" |
|
||||
"writeregbin" |
|
||||
"writeregdword" |
|
||||
"writeregexpandstr" |
|
||||
"writeregstr" |
|
||||
"writeuninstaller" |
|
||||
"xpstyle" |
|
||||
|
||||
/* Flow control instructions */
|
||||
"abort" |
|
||||
"call" |
|
||||
"clearerrors" |
|
||||
"goto" |
|
||||
"ifabort" |
|
||||
"iferrors" |
|
||||
"iffileexists" |
|
||||
"ifrebootflag" |
|
||||
"intcmp" |
|
||||
"intcmpu" |
|
||||
"iswindow" |
|
||||
"messagebox" |
|
||||
"reboot" |
|
||||
"return" |
|
||||
"quit" |
|
||||
"seterrors" |
|
||||
"strcmp" |
|
||||
"strcmps" { addToken(Token.FUNCTION); }
|
||||
|
||||
/* Compiler utility commands */
|
||||
"!addincludedir" |
|
||||
"!addplugindir" |
|
||||
"!define" |
|
||||
"!include" |
|
||||
"!cd" |
|
||||
"!echo" |
|
||||
"!error" |
|
||||
"!insertmacro" |
|
||||
"!packhdr" |
|
||||
"!system" |
|
||||
"!warning" |
|
||||
"!undef" |
|
||||
"!verbose" |
|
||||
|
||||
/* Conditional compilation */
|
||||
"!ifdef" |
|
||||
"!ifndef" |
|
||||
"!if" |
|
||||
"!else" |
|
||||
"!endif" |
|
||||
"!macro" |
|
||||
"!macroend" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
/* Global variables */
|
||||
"$0" |
|
||||
"$1" |
|
||||
"$2" |
|
||||
"$3" |
|
||||
"$4" |
|
||||
"$5" |
|
||||
"$6" |
|
||||
"$7" |
|
||||
"$8" |
|
||||
"$9" |
|
||||
"$INSTDIR" |
|
||||
"$OUTDIR" |
|
||||
"$CMDLINE" |
|
||||
"$LANGUAGE" |
|
||||
|
||||
/* Local variables */
|
||||
("$R0"{Digit}) |
|
||||
|
||||
/* Constants */
|
||||
"ARCHIVE" |
|
||||
"CENTER" |
|
||||
"CONTROL" |
|
||||
"CUR" |
|
||||
"EXT" |
|
||||
("F"{NonzeroDigit}) |
|
||||
("F1"{Digit}) |
|
||||
("F2"[0-4]) |
|
||||
"FILE_ATTRIBUTE_ARCHIVE" |
|
||||
"MB_ABORTRETRYIGNORE" |
|
||||
"RIGHT" |
|
||||
"RO" |
|
||||
"SET" |
|
||||
"SHIFT" |
|
||||
"SW_SHOWMAXIMIZED" |
|
||||
"SW_SHOWMINIMIZED" |
|
||||
"SW_SHOWNORMAL" |
|
||||
"a" |
|
||||
"admin" |
|
||||
"all" |
|
||||
"alwaysoff" |
|
||||
"auto" |
|
||||
"both" |
|
||||
"bottom" |
|
||||
"bzip2" |
|
||||
"checkbox" |
|
||||
"colored" |
|
||||
"components" |
|
||||
"current" |
|
||||
"custom" |
|
||||
"directory" |
|
||||
"force" |
|
||||
"hide" |
|
||||
"highest" |
|
||||
"ifnewer" |
|
||||
"instfiles" |
|
||||
"license" |
|
||||
"listonly" |
|
||||
"manual" |
|
||||
"nevershow" |
|
||||
"none" |
|
||||
"off" |
|
||||
"on" |
|
||||
"r" |
|
||||
"radiobuttons" |
|
||||
"show" |
|
||||
"silent" |
|
||||
"silentlog" |
|
||||
"smooth" |
|
||||
"textonly" |
|
||||
"top" |
|
||||
"try" |
|
||||
"uninstConfirm" |
|
||||
"user" |
|
||||
"w" |
|
||||
"zlib" |
|
||||
"$$" |
|
||||
"$DESKTOP" |
|
||||
"$EXEDIR" |
|
||||
"$HWNDPARENT" |
|
||||
"$PLUGINSDIR" |
|
||||
"$PROGRAMFILES" |
|
||||
"$QUICKLAUNCH" |
|
||||
"$SMPROGRAMS" |
|
||||
"$SMSTARTUP" |
|
||||
"$STARTMENU" |
|
||||
"$SYSDIR" |
|
||||
"$TEMP" |
|
||||
"$WINDIR" |
|
||||
"$\n" |
|
||||
"$\r" |
|
||||
"${NSISDIR}" |
|
||||
"ALT" |
|
||||
"END" |
|
||||
"FILE_ATTRIBUTE_HIDDEN" |
|
||||
"FILE_ATTRIBUTE_NORMAL" |
|
||||
"FILE_ATTRIBUTE_OFFLINE" |
|
||||
"FILE_ATTRIBUTE_READONLY" |
|
||||
"FILE_ATTRIBUTE_SYSTEM" |
|
||||
"FILE_ATTRIBUTE_TEMPORARY" |
|
||||
"HIDDEN" |
|
||||
"HKCC" |
|
||||
"HKCR" |
|
||||
"HKCU" |
|
||||
"HKDD" |
|
||||
"HKLM" |
|
||||
"HKPD" |
|
||||
"HKU" |
|
||||
"SHCTX" |
|
||||
"IDABORT" |
|
||||
"IDCANCEL" |
|
||||
"IDIGNORE" |
|
||||
"IDNO" |
|
||||
"IDOK" |
|
||||
"IDRETRY" |
|
||||
"IDYES" |
|
||||
"LEFT" |
|
||||
"MB_DEFBUTTON1" |
|
||||
"MB_DEFBUTTON2" |
|
||||
"MB_DEFBUTTON3" |
|
||||
"MB_DEFBUTTON4" |
|
||||
"MB_ICONEXCLAMATION" |
|
||||
"MB_ICONINFORMATION" |
|
||||
"MB_ICONQUESTION" |
|
||||
"MB_ICONSTOP" |
|
||||
"MB_OK" |
|
||||
"MB_OKCANCEL" |
|
||||
"MB_RETRYCANCEL" |
|
||||
"MB_RIGHT" |
|
||||
"MB_SETFOREGROUND" |
|
||||
"MB_TOPMOST" |
|
||||
"MB_YESNO" |
|
||||
"MB_YESNOCANCEL" |
|
||||
"NORMAL" |
|
||||
"OFFLINE" |
|
||||
"READONLY" |
|
||||
"SYSTEM" |
|
||||
"TEMPORARY" { addToken(Token.VARIABLE); }
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
|
||||
/* Operators. */
|
||||
{Operator} { addToken(Token.OPERATOR); }
|
||||
|
||||
{BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
{Variable} { addToken(Token.VARIABLE); }
|
||||
|
||||
{WhiteSpace}+ { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* String/Character literals. */
|
||||
\" { start = zzMarkedPos-1; yybegin(STRING); }
|
||||
\' { start = zzMarkedPos-1; yybegin(CHAR_LITERAL); }
|
||||
\` { start = zzMarkedPos-1; yybegin(BACKTICKS); }
|
||||
|
||||
/* Comment literals. */
|
||||
"/**/" { addToken(Token.COMMENT_MULTILINE); }
|
||||
{MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
|
||||
{LineCommentBegin} { start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
|
||||
|
||||
/* Separators. */
|
||||
{Separator} { addToken(Token.SEPARATOR); }
|
||||
{Separator2} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
/* Numbers */
|
||||
{IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
|
||||
{ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters and flag them as identifiers. */
|
||||
. { addToken(Token.IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<STRING> {
|
||||
[^\n\\\$\"]+ {}
|
||||
\\. { /* Skip all escaped chars. */ }
|
||||
\\ { /* Line ending in '\' => continue to next line. */
|
||||
addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
return firstToken;
|
||||
}
|
||||
{Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
|
||||
{VariableStart} {}
|
||||
\" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<CHAR_LITERAL> {
|
||||
[^\n\\\$\']+ {}
|
||||
\\. { /* Skip all escaped chars. */ }
|
||||
\\ { /* Line ending in '\' => continue to next line. */
|
||||
addToken(start,zzStartRead, Token.LITERAL_CHAR);
|
||||
return firstToken;
|
||||
}
|
||||
{Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
|
||||
{VariableStart} {}
|
||||
\' { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_CHAR); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<BACKTICKS> {
|
||||
[^\n\\\$\`]+ {}
|
||||
\\. { /* Skip all escaped chars. */ }
|
||||
\\ { /* Line ending in '\' => continue to next line. */
|
||||
addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE);
|
||||
return firstToken;
|
||||
}
|
||||
{Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
|
||||
{VariableStart} {}
|
||||
\` { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE); }
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<MLC> {
|
||||
[^hwf\n\*]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
{MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
|
||||
\* {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<EOL_COMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -1,808 +0,0 @@
|
||||
/*
|
||||
* 01/26/2008
|
||||
*
|
||||
* PerlTokenMaker.java - Scanner for Perl
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for Perl.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>PerlTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class PerlTokenMaker
|
||||
%extends AbstractJFlexCTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
/**
|
||||
* Token type specific to PerlTokenMaker; this signals that we are inside
|
||||
* an unquoted/double quoted/backtick EOF heredoc.
|
||||
*/
|
||||
public static final int INTERNAL_HEREDOC_EOF_UNQUOTED = -1;
|
||||
|
||||
/**
|
||||
* Token type specific to PerlTokenMaker; this signals that we are inside
|
||||
* an single quoted EOF heredoc.
|
||||
*/
|
||||
public static final int INTERNAL_HEREDOC_EOF_SINGLE_QUOTED = -2;
|
||||
|
||||
/**
|
||||
* Token type specific to PerlTokenMaker; this signals that we are inside
|
||||
* an unquoted/double quoted/backtick EOT heredoc.
|
||||
*/
|
||||
public static final int INTERNAL_HEREDOC_EOT_UNQUOTED = -3;
|
||||
|
||||
/**
|
||||
* Token type specific to PerlTokenMaker; this signals that we are inside
|
||||
* an single quoted EOT heredoc.
|
||||
*/
|
||||
public static final int INTERNAL_HEREDOC_EOT_SINGLE_QUOTED = -4;
|
||||
|
||||
/**
|
||||
* Token type specific to PerlTokenMaker; this signals we are in a POD
|
||||
* block.
|
||||
*/
|
||||
public static final int INTERNAL_POD = -5;
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public PerlTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens as an
|
||||
* "end token;" that is, at <code>zzMarkedPos</code>.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addEndToken(int tokenType) {
|
||||
addToken(zzMarkedPos,zzMarkedPos, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "#", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public boolean getMarkOccurrencesOfTokenType(int type) {
|
||||
return super.getMarkOccurrencesOfTokenType(type) || type==Token.VARIABLE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = STRING;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.LITERAL_CHAR:
|
||||
state = CHAR_LITERAL;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.LITERAL_BACKQUOTE:
|
||||
state = BACKTICKS;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_HEREDOC_EOF_UNQUOTED:
|
||||
state = HEREDOC_EOF_UNQUOTED;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_HEREDOC_EOF_SINGLE_QUOTED:
|
||||
state = HEREDOC_EOF_SINGLE_QUOTED;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_HEREDOC_EOT_UNQUOTED:
|
||||
state = HEREDOC_EOT_UNQUOTED;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_HEREDOC_EOT_SINGLE_QUOTED:
|
||||
state = HEREDOC_EOT_SINGLE_QUOTED;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_POD:
|
||||
state = POD;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns whether a regular expression token can follow the specified
|
||||
* token.
|
||||
*
|
||||
* @param t The token to check, which may be <code>null</code>.
|
||||
* @return Whether a regular expression token may follow this one.
|
||||
*/
|
||||
private static final boolean regexCanFollow(Token t) {
|
||||
char ch;
|
||||
// We basically try to mimic Eclipse's JS editor's behavior here.
|
||||
return t==null ||
|
||||
//t.isOperator() ||
|
||||
(t.length()==1 && (
|
||||
(ch=t.charAt(0))=='=' ||
|
||||
ch=='(' ||
|
||||
ch==',' ||
|
||||
ch=='?' ||
|
||||
ch==':' ||
|
||||
ch=='[' ||
|
||||
ch=='!' ||
|
||||
ch=='&'
|
||||
)) ||
|
||||
/* Operators "==", "===", "!=", "!==", etc. */
|
||||
(t.getType()==Token.OPERATOR &&
|
||||
((ch=t.charAt(t.length()-1))=='=' || ch=='~'));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Letter = [A-Za-z]
|
||||
NonzeroDigit = [1-9]
|
||||
Digit = ("0"|{NonzeroDigit})
|
||||
HexDigit = ({Digit}|[A-Fa-f])
|
||||
OctalDigit = ([0-7])
|
||||
/*Escape = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)))*/
|
||||
NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\'\`]|"#"|"\\")
|
||||
IdentifierStart = ({Letter}|"_")
|
||||
IdentifierPart = ({IdentifierStart}|{Digit})
|
||||
|
||||
LineTerminator = (\n)
|
||||
WhiteSpace = ([ \t\f])
|
||||
|
||||
LineCommentBegin = "#"
|
||||
|
||||
IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
|
||||
IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
|
||||
IntegerLiteral = ({IntegerHelper1}[lL]?)
|
||||
HexLiteral = ({IntegerHelper2}[lL]?)
|
||||
FloatHelper1 = ([fFdD]?)
|
||||
FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
|
||||
FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
|
||||
FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
|
||||
FloatLiteral3 = ({Digit}+{FloatHelper2})
|
||||
FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
|
||||
ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
|
||||
|
||||
Separator = ([\(\)\{\}\[\]])
|
||||
Separator2 = ([\;:,.])
|
||||
|
||||
VariableStart = ([\$\@\%)]"$"?)
|
||||
BracedVariable = ({VariableStart}\{{Identifier}\})
|
||||
UnbracedVariable = ({VariableStart}{Identifier})
|
||||
BracedShellVariable = ([\$]\{[\&\`\'\+\*\.\/\|\,\\\"\;\#\%\=\-\~\^\:\?\!\@\$\<\>\)\(\[\]\)\}])
|
||||
UnbracedShellVariable = ([\$][\&\`\'\+\*\.\/\|\,\\\"\;\#\%\=\-\~\^\:\?\!\@\$\<\>\)\(\[\]\)])
|
||||
MatchVariable = ([\$]{Digit})
|
||||
Variable = ({BracedVariable}|{UnbracedVariable}|{BracedShellVariable}|{UnbracedShellVariable}|{MatchVariable})
|
||||
Regex = ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[msixpogcadlu]*)
|
||||
|
||||
NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>"|"->")
|
||||
AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
|
||||
BindingOperator = ("=~"|"!~")
|
||||
FunnyOperator = (([\*][\'\"])|([\&][\'\"]))
|
||||
Operator = ({NonAssignmentOperator}|{AssignmentOperator}|{BindingOperator}|{FunnyOperator})
|
||||
|
||||
PodCommandsExceptCut = ("="("pod"|"head1"|"head2"|"head3"|"head4"|"over"|"item"|"back"|"begin"|"end"|"for"|"encoding"))
|
||||
|
||||
Identifier = ({IdentifierStart}{IdentifierPart}*)
|
||||
ErrorIdentifier = ({NonSeparator}+)
|
||||
|
||||
|
||||
%state STRING
|
||||
%state CHAR_LITERAL
|
||||
%state BACKTICKS
|
||||
%state HEREDOC_EOF_UNQUOTED
|
||||
%state HEREDOC_EOF_SINGLE_QUOTED
|
||||
%state HEREDOC_EOT_UNQUOTED
|
||||
%state HEREDOC_EOT_SINGLE_QUOTED
|
||||
%state POD
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
/* Keywords */
|
||||
"and" |
|
||||
"cmp" |
|
||||
"continue" |
|
||||
"do" |
|
||||
"else" |
|
||||
"elsif" |
|
||||
"eq" |
|
||||
"esac" |
|
||||
"for" |
|
||||
"foreach" |
|
||||
"ge" |
|
||||
"if" |
|
||||
"last" |
|
||||
"le" |
|
||||
"ne" |
|
||||
"next" |
|
||||
"not" |
|
||||
"or" |
|
||||
"redo" |
|
||||
"sub" |
|
||||
"unless" |
|
||||
"until" |
|
||||
"while" |
|
||||
"xor" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
/* Standard Functions */
|
||||
"abs" |
|
||||
"accept" |
|
||||
"alarm" |
|
||||
"atan2" |
|
||||
"bind" |
|
||||
"binmode" |
|
||||
"bless" |
|
||||
"caller" |
|
||||
"chdir" |
|
||||
"chmod" |
|
||||
"chomp" |
|
||||
"chop" |
|
||||
"chown" |
|
||||
"chr" |
|
||||
"chroot" |
|
||||
"close" |
|
||||
"closedir" |
|
||||
"connect" |
|
||||
"cos" |
|
||||
"crypt" |
|
||||
"dbmclose" |
|
||||
"dbmopen" |
|
||||
"defined" |
|
||||
"delete" |
|
||||
"die" |
|
||||
"dump" |
|
||||
"each" |
|
||||
"endgrent" |
|
||||
"endhostent" |
|
||||
"endnetent" |
|
||||
"endprotoent" |
|
||||
"endpwent" |
|
||||
"endservent" |
|
||||
"eof" |
|
||||
"eval" |
|
||||
"exec" |
|
||||
"exists" |
|
||||
"exit" |
|
||||
"exp" |
|
||||
"fcntl" |
|
||||
"fileno" |
|
||||
"flock" |
|
||||
"fork" |
|
||||
"formline" |
|
||||
"getc" |
|
||||
"getgrent" |
|
||||
"getgrgid" |
|
||||
"getgrnam" |
|
||||
"gethostbyaddr" |
|
||||
"gethostbyname" |
|
||||
"gethostent" |
|
||||
"getlogin" |
|
||||
"getnetbyaddr" |
|
||||
"getnetbyname" |
|
||||
"getnetent" |
|
||||
"getpeername" |
|
||||
"getpgrp" |
|
||||
"getppid" |
|
||||
"getpriority" |
|
||||
"getprotobyname" |
|
||||
"getprotobynumber" |
|
||||
"getprotoent" |
|
||||
"getpwent" |
|
||||
"getpwnam" |
|
||||
"getpwuid" |
|
||||
"getservbyname" |
|
||||
"getservbyport" |
|
||||
"getservent" |
|
||||
"getsockname" |
|
||||
"getsockopt" |
|
||||
"glob" |
|
||||
"gmtime" |
|
||||
"goto" |
|
||||
"grep" |
|
||||
"hex" |
|
||||
"index" |
|
||||
"int" |
|
||||
"ioctl" |
|
||||
"join" |
|
||||
"keys" |
|
||||
"kill" |
|
||||
"last" |
|
||||
"lc" |
|
||||
"lcfirst" |
|
||||
"length" |
|
||||
"link" |
|
||||
"listen" |
|
||||
"local" |
|
||||
"localtime" |
|
||||
"log" |
|
||||
"lstat" |
|
||||
"map" |
|
||||
"mkdir" |
|
||||
"msgctl" |
|
||||
"msgget" |
|
||||
"msgrcv" |
|
||||
"msgsnd" |
|
||||
"my" |
|
||||
"next" |
|
||||
"no" |
|
||||
"oct" |
|
||||
"open" |
|
||||
"opendir" |
|
||||
"ord" |
|
||||
"our" |
|
||||
"pack" |
|
||||
"package" |
|
||||
"pipe" |
|
||||
"pop" |
|
||||
"pos" |
|
||||
"print" |
|
||||
"printf" |
|
||||
"prototype" |
|
||||
"push" |
|
||||
"quotemeta" |
|
||||
"rand" |
|
||||
"read" |
|
||||
"readdir" |
|
||||
"readline" |
|
||||
"readlink" |
|
||||
"readpipe" |
|
||||
"recv" |
|
||||
"redo" |
|
||||
"ref" |
|
||||
"rename" |
|
||||
"require" |
|
||||
"reset" |
|
||||
"return" |
|
||||
"reverse" |
|
||||
"rewinddir" |
|
||||
"rindex" |
|
||||
"rmdir" |
|
||||
"scalar" |
|
||||
"seek" |
|
||||
"seekdir" |
|
||||
"select" |
|
||||
"semctl" |
|
||||
"semget" |
|
||||
"semop" |
|
||||
"send" |
|
||||
"sethostent" |
|
||||
"setgrent" |
|
||||
"setnetent" |
|
||||
"setpgrp" |
|
||||
"setpriority" |
|
||||
"setprotoent" |
|
||||
"setpwent" |
|
||||
"setservent" |
|
||||
"setsockopt" |
|
||||
"shift" |
|
||||
"shmctl" |
|
||||
"shmget" |
|
||||
"shmread" |
|
||||
"shmwrite" |
|
||||
"shutdown" |
|
||||
"sin" |
|
||||
"sleep" |
|
||||
"socket" |
|
||||
"socketpair" |
|
||||
"sort" |
|
||||
"splice" |
|
||||
"split" |
|
||||
"sprintf" |
|
||||
"sqrt" |
|
||||
"srand" |
|
||||
"stat" |
|
||||
"study" |
|
||||
"sub" |
|
||||
"substr" |
|
||||
"symlink" |
|
||||
"syscall" |
|
||||
"sysopen" |
|
||||
"sysread" |
|
||||
"sysseek" |
|
||||
"system" |
|
||||
"syswrite" |
|
||||
"tell" |
|
||||
"telldir" |
|
||||
"tie" |
|
||||
"tied" |
|
||||
"time" |
|
||||
"times" |
|
||||
"truncate" |
|
||||
"uc" |
|
||||
"ucfirst" |
|
||||
"umask" |
|
||||
"undef" |
|
||||
"unlink" |
|
||||
"unpack" |
|
||||
"unshift" |
|
||||
"untie" |
|
||||
"use" |
|
||||
"utime" |
|
||||
"values" |
|
||||
"vec" |
|
||||
"wait" |
|
||||
"waitpid" |
|
||||
"wantarray" |
|
||||
"warn" |
|
||||
"write" { addToken(Token.FUNCTION); }
|
||||
|
||||
}
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
{WhiteSpace}+ { addToken(Token.WHITESPACE); }
|
||||
{Variable} { addToken(Token.VARIABLE); }
|
||||
|
||||
/* String/Character literals. */
|
||||
\" { start = zzMarkedPos-1; yybegin(STRING); }
|
||||
\' { start = zzMarkedPos-1; yybegin(CHAR_LITERAL); }
|
||||
\` { start = zzMarkedPos-1; yybegin(BACKTICKS); }
|
||||
|
||||
/* Comment literals. */
|
||||
{LineCommentBegin}"!".* { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; }
|
||||
{LineCommentBegin}.* { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
|
||||
/* Easily identifiable regexes of the form "/.../". This is not foolproof. */
|
||||
{Regex} {
|
||||
boolean highlightedAsRegex = false;
|
||||
if (firstToken==null) {
|
||||
addToken(Token.REGEX);
|
||||
highlightedAsRegex = true;
|
||||
}
|
||||
else {
|
||||
// If this is *likely* to be a regex, based on
|
||||
// the previous token, highlight it as such.
|
||||
Token t = firstToken.getLastNonCommentNonWhitespaceToken();
|
||||
if (regexCanFollow(t)) {
|
||||
addToken(Token.REGEX);
|
||||
highlightedAsRegex = true;
|
||||
}
|
||||
}
|
||||
// If it doesn't *appear* to be a regex, highlight it as
|
||||
// individual tokens.
|
||||
if (!highlightedAsRegex) {
|
||||
int temp = zzStartRead + 1;
|
||||
addToken(zzStartRead, zzStartRead, Token.OPERATOR);
|
||||
zzStartRead = zzCurrentPos = zzMarkedPos = temp;
|
||||
}
|
||||
}
|
||||
|
||||
/* More regexes (m/.../, s!...!!, etc.). This is nowhere near */
|
||||
/* exhaustive, but is rather just the common ones. */
|
||||
m"/"[^/]*"/"[msixpodualgc]* { addToken(Token.REGEX); }
|
||||
m"!"[^!]*"!"[msixpodualgc]* { addToken(Token.REGEX); }
|
||||
m"|"[^\|]*"|"[msixpodualgc]* { addToken(Token.REGEX); }
|
||||
m\\[^\\]*\\[msixpodualgc]* { addToken(Token.REGEX); }
|
||||
s"/"[^/]*"/"[^/]*"/"[msixpodualgcer]* { addToken(Token.REGEX); }
|
||||
s"!"[^!]*"!"[^!]*"!"[msixpodualgcer]* { addToken(Token.REGEX); }
|
||||
s"|"[^\|]*"|"[^\|]*"|"[msixpodualgcer]* { addToken(Token.REGEX); }
|
||||
(tr|y)"/"[^/]*"/"[^/]*"/"[cdsr]* { addToken(Token.REGEX); }
|
||||
(tr|y)"!"[^!]*"!"[^!]*"!"[cdsr]* { addToken(Token.REGEX); }
|
||||
(tr|y)"|"[^\|]*"|"[^\|]*"|"[cdsr]* { addToken(Token.REGEX); }
|
||||
(tr|y)\\[^\\]*\\[^\\]*\\[cdsr]* { addToken(Token.REGEX); }
|
||||
qr"/"[^/]*"/"[msixpodual]* { addToken(Token.REGEX); }
|
||||
qr"!"[^/]*"!"[msixpodual]* { addToken(Token.REGEX); }
|
||||
qr"|"[^/]*"|"[msixpodual]* { addToken(Token.REGEX); }
|
||||
qr\\[^/]*\\[msixpodual]* { addToken(Token.REGEX); }
|
||||
|
||||
/* "Here-document" syntax. This is only implemented for the common */
|
||||
/* cases. */
|
||||
"<<EOF" { start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
|
||||
"<<" {WhiteSpace}* \""EOF"\" { start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
|
||||
"<<" {WhiteSpace}* \'"EOF"\' { start = zzStartRead; yybegin(HEREDOC_EOF_SINGLE_QUOTED); }
|
||||
"<<" {WhiteSpace}* \`"EOF"\` { start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
|
||||
"<<EOT" { start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
|
||||
"<<" {WhiteSpace}* \""EOT"\" { start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
|
||||
"<<" {WhiteSpace}* \'"EOT"\' { start = zzStartRead; yybegin(HEREDOC_EOT_SINGLE_QUOTED); }
|
||||
"<<" {WhiteSpace}* \`"EOT"\` { start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
|
||||
|
||||
/* POD commands. */
|
||||
{PodCommandsExceptCut} { addToken(Token.COMMENT_EOL); start = zzMarkedPos; yybegin(POD); }
|
||||
|
||||
/* Separators and operators. */
|
||||
{Separator} { addToken(Token.SEPARATOR); }
|
||||
{Separator2} { addToken(Token.IDENTIFIER); }
|
||||
{Operator} { addToken(Token.OPERATOR); }
|
||||
|
||||
/* Numbers */
|
||||
{IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
|
||||
{FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
{ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
|
||||
|
||||
{ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters and flag them as bad. */
|
||||
. { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<STRING> {
|
||||
[^\n\\\$\@\%\"]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
{Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
|
||||
{VariableStart} {}
|
||||
\" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<CHAR_LITERAL> {
|
||||
[^\n\\\']+ {}
|
||||
\\.? { /* Skip escaped single quotes only, but this should still work. */ }
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
|
||||
\' { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<BACKTICKS> {
|
||||
[^\n\\\$\@\%\`]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
{Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
|
||||
{VariableStart} {}
|
||||
\` { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<HEREDOC_EOF_UNQUOTED> {
|
||||
/* NOTE: The closing "EOF" is supposed to be on a line by itself - */
|
||||
/* no surrounding whitespace or other chars. However, the way */
|
||||
/* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
|
||||
/* work. Fortunately we don't need the start- and end-line anchors */
|
||||
/* since the production after "EOF" will match any line containing */
|
||||
/* EOF and any other chars. */
|
||||
/* NOTE2: This case is used for unquoted <<EOF, double quoted */
|
||||
/* <<"EOF" and backticks <<`EOF`, since they all follow the same */
|
||||
/* syntactic rules. */
|
||||
"EOF" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
|
||||
[^\n\\\$\@\%]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
{Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.PREPROCESSOR); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
|
||||
{VariableStart} {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<HEREDOC_EOF_SINGLE_QUOTED> {
|
||||
/* NOTE: The closing "EOF" is supposed to be on a line by itself - */
|
||||
/* no surrounding whitespace or other chars. However, the way */
|
||||
/* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
|
||||
/* work. Fortunately we don't need the start- and end-line anchors */
|
||||
/* since the production after "EOF" will match any line containing */
|
||||
/* EOF and any other chars. */
|
||||
"EOF" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
|
||||
[^\n\\]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<HEREDOC_EOT_UNQUOTED> {
|
||||
/* NOTE: The closing "EOT" is supposed to be on a line by itself - */
|
||||
/* no surrounding whitespace or other chars. However, the way */
|
||||
/* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
|
||||
/* work. Fortunately we don't need the start- and end-line anchors */
|
||||
/* since the production after "EOT" will match any line containing */
|
||||
/* EOF and any other chars. */
|
||||
/* NOTE2: This case is used for unquoted <<EOT, double quoted */
|
||||
/* <<"EOT" and backticks <<`EOT`, since they all follow the same */
|
||||
/* syntactic rules. */
|
||||
"EOT" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
|
||||
[^\n\\\$\@\%]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
{Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.PREPROCESSOR); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
|
||||
{VariableStart} {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<HEREDOC_EOT_SINGLE_QUOTED> {
|
||||
/* NOTE: The closing "EOT" is supposed to be on a line by itself - */
|
||||
/* no surrounding whitespace or other chars. However, the way */
|
||||
/* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
|
||||
/* work. Fortunately we don't need the start- and end-line anchors */
|
||||
/* since the production after "EOT" will match any line containing */
|
||||
/* EOT and any other chars. */
|
||||
"EOT" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
|
||||
[^\n\\]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<POD> {
|
||||
[^\n\=]+ {}
|
||||
"=cut" { if (start==zzStartRead) { addToken(Token.COMMENT_DOCUMENTATION); yybegin(YYINITIAL); } }
|
||||
{PodCommandsExceptCut} { if (start==zzStartRead) { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; } }
|
||||
= {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_POD); return firstToken; }
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,233 +0,0 @@
|
||||
/*
|
||||
* 03/21/2005
|
||||
*
|
||||
* PropertiesFileTokenMaker.java - Scanner for properties files.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* This class splits up text into tokens representing a Java properties file.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>PropertiesFileTokenMaker.java</code> file will
|
||||
* contain two definitions of both <code>zzRefill</code> and
|
||||
* <code>yyreset</code>. You should hand-delete the second of each
|
||||
* definition (the ones generated by the lexer), as these generated
|
||||
* methods modify the input buffer, which we'll never have to do.
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.4
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class PropertiesFileTokenMaker
|
||||
%extends AbstractJFlexTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public PropertiesFileTokenMaker() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "#", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = VALUE;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
* @exception IOException if any I/O-Error occurs.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Equals = ([=\:])
|
||||
Name = ([^=\: \t\n#!]*)
|
||||
Whitespace = ([ \t]+)
|
||||
Comment = ([#!].*)
|
||||
SingleQuote = (')
|
||||
|
||||
%state VALUE
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
{Name} { addToken(Token.RESERVED_WORD); }
|
||||
{Equals} { start = zzMarkedPos; addToken(Token.OPERATOR); yybegin(VALUE); }
|
||||
{Whitespace} { addToken(Token.WHITESPACE); }
|
||||
{Comment} { addToken(Token.COMMENT_EOL); }
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
}
|
||||
|
||||
<VALUE> {
|
||||
{SingleQuote}[^']*{SingleQuote}? { addToken(start, zzMarkedPos-1, Token.LITERAL_STRING_DOUBLE_QUOTE); start = zzMarkedPos; }
|
||||
[^'\{\\]+ {}
|
||||
"{"[^\}]*"}"? { int temp=zzStartRead; addToken(start, zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp, zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
|
||||
[\\]. {}
|
||||
[\\] { addToken(start, zzEndRead, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addNullToken(); return firstToken; }
|
||||
}
|
||||
@@ -1,610 +0,0 @@
|
||||
/* The following code was generated by JFlex 1.4.1 on 1/28/11 4:16 PM */
|
||||
/*
|
||||
* 03/21/2005
|
||||
* PropertiesFileTokenMaker.java - Scanner for properties files.
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
|
||||
import org.fife.ui.rsyntaxtextarea.Token;
|
||||
import org.fife.ui.rsyntaxtextarea.TokenImpl;
|
||||
|
||||
/**
|
||||
* This class splits up text into tokens representing a Java properties file.
|
||||
* <p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost completely
|
||||
* removed to be competitive with the handwritten lexers (subclasses of
|
||||
* <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around). We can
|
||||
* achieve this because RText always scans exactly 1 line of tokens at a time,
|
||||
* and hands the scanner this line as an array of characters (a Segment really).
|
||||
* Since tokens contain pointers to char arrays instead of Strings holding their
|
||||
* contents, there is no need for allocating new memory for Strings.
|
||||
* <p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.
|
||||
* <p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>PropertiesFileTokenMaker.java</code> file will
|
||||
* contain two definitions of both <code>zzRefill</code> and
|
||||
* <code>yyreset</code>. You should hand-delete the second of each definition
|
||||
* (the ones generated by the lexer), as these generated methods modify the
|
||||
* input buffer, which we'll never have to do.
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT be
|
||||
* initialized. This is a needless memory allocation for us since we will be
|
||||
* pointing the array somewhere else anyway.
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would with
|
||||
* any other <code>TokenMaker</code> instance.
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.4
|
||||
*
|
||||
*/
|
||||
public class PropertiesFileTokenMaker extends AbstractJFlexTokenMaker {
|
||||
|
||||
/** This character denotes the end of file */
|
||||
public static final int YYEOF = -1;
|
||||
/** initial size of the lookahead buffer */
|
||||
private static final int ZZ_BUFFERSIZE = 16384;
|
||||
/** lexical states */
|
||||
public static final int YYINITIAL = 0;
|
||||
public static final int VALUE = 1;
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final String ZZ_CMAP_PACKED = "\11\0\1\3\1\2\25\0\1\3\1\4\1\0\1\4\3\0\1\5"
|
||||
+ "\22\0\1\1\2\0\1\1\36\0\1\6\36\0\1\7\1\0\1\10" + "\uff82\0";
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
|
||||
/**
|
||||
* Translates DFA states to action switch labels.
|
||||
*/
|
||||
private static final int[] ZZ_ACTION = zzUnpackAction();
|
||||
private static final String ZZ_ACTION_PACKED_0 = "\1\1\1\0\1\1\1\2\1\3\1\4\1\5\1\6" + "\1\7\1\10\1\6\1\5\1\10";
|
||||
|
||||
private static int[] zzUnpackAction() {
|
||||
int[] result = new int[13];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAction(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a state to a row index in the transition table
|
||||
*/
|
||||
private static final int[] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\11\0\22\0\33\0\44\0\55\0\66\0\77"
|
||||
+ "\0\110\0\121\0\33\0\33\0\33";
|
||||
|
||||
private static int[] zzUnpackRowMap() {
|
||||
int[] result = new int[13];
|
||||
int offset = 0;
|
||||
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackRowMap(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int high = packed.charAt(i++) << 16;
|
||||
result[j++] = high | packed.charAt(i++);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* The transition table of the DFA
|
||||
*/
|
||||
private static final int[] ZZ_TRANS = zzUnpackTrans();
|
||||
private static final String ZZ_TRANS_PACKED_0 = "\1\3\1\4\1\0\1\5\1\6\4\3\5\7\1\10"
|
||||
+ "\1\11\1\12\1\7\1\3\4\0\4\3\14\0\1\5" + "\5\0\2\6\1\0\6\6\5\7\3\0\1\7\5\10"
|
||||
+ "\1\13\3\10\2\14\1\0\6\14\10\12\1\15";
|
||||
|
||||
private static int[] zzUnpackTrans() {
|
||||
int[] result = new int[90];
|
||||
int offset = 0;
|
||||
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackTrans(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
value--;
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/* error codes */
|
||||
private static final int ZZ_UNKNOWN_ERROR = 0;
|
||||
private static final int ZZ_NO_MATCH = 1;
|
||||
private static final int ZZ_PUSHBACK_2BIG = 2;
|
||||
/* error messages for the codes above */
|
||||
private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input",
|
||||
"Error: pushback value was too large" };
|
||||
/**
|
||||
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
|
||||
*/
|
||||
private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 = "\1\1\1\0\1\1\1\11\6\1\3\11";
|
||||
|
||||
private static int[] zzUnpackAttribute() {
|
||||
int[] result = new int[13];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAttribute(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/** the input device */
|
||||
private java.io.Reader zzReader;
|
||||
/** the current state of the DFA */
|
||||
private int zzState;
|
||||
/** the current lexical state */
|
||||
private int zzLexicalState = YYINITIAL;
|
||||
/**
|
||||
* this buffer contains the current text to be matched and is the source of the
|
||||
* yytext() string
|
||||
*/
|
||||
private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
|
||||
/** the textposition at the last accepting state */
|
||||
private int zzMarkedPos;
|
||||
/** the current text position in the buffer */
|
||||
private int zzCurrentPos;
|
||||
/** startRead marks the beginning of the yytext() string in the buffer */
|
||||
private int zzStartRead;
|
||||
/**
|
||||
* endRead marks the last character in the buffer, that has been read from input
|
||||
*/
|
||||
private int zzEndRead;
|
||||
/** zzAtEOF == true <=> the scanner is at the EOF */
|
||||
private boolean zzAtEOF;
|
||||
/* user code: */
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a no-parameter
|
||||
* constructor.
|
||||
*/
|
||||
public PropertiesFileTokenMaker() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos - 1, tokenType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start, end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "#", null };
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated from
|
||||
* <code>text</code>. This method must be implemented by subclasses so they can
|
||||
* correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing the syntax
|
||||
* highlighted text.
|
||||
*/
|
||||
@Override
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = VALUE;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise <code>false</code>.
|
||||
* @exception IOException if any I/O-Error occurs.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos >= s.offset + s.count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream. Does not close the old
|
||||
* reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream <b>cannot</b> be
|
||||
* reused (internal buffer is discarded and lost). Lexical state is set to
|
||||
* <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill no longer
|
||||
* "refills" the buffer (since the way we do it, it's always "full" the first
|
||||
* time through, since it points to the segment's array). So, we assign
|
||||
* zzEndRead here.
|
||||
*/
|
||||
// zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner There is also a java.io.InputStream version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
public PropertiesFileTokenMaker(java.io.Reader in) {
|
||||
this.zzReader = in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner. There is also java.io.Reader version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Inputstream to read input from.
|
||||
*/
|
||||
public PropertiesFileTokenMaker(java.io.InputStream in) {
|
||||
this(new java.io.InputStreamReader(in));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unpacks the compressed character translation table.
|
||||
*
|
||||
* @param packed the packed character translation table
|
||||
* @return the unpacked character translation table
|
||||
*/
|
||||
private static char[] zzUnpackCMap(String packed) {
|
||||
char[] map = new char[0x10000];
|
||||
int i = 0; /* index in packed string */
|
||||
int j = 0; /* index in unpacked array */
|
||||
while (i < 42) {
|
||||
int count = packed.charAt(i++);
|
||||
char value = packed.charAt(i++);
|
||||
do
|
||||
map[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the input stream.
|
||||
*/
|
||||
public final void yyclose() throws java.io.IOException {
|
||||
zzAtEOF = true; /* indicate end of file */
|
||||
zzEndRead = zzStartRead; /* invalidate buffer */
|
||||
if (zzReader != null)
|
||||
zzReader.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current lexical state.
|
||||
*/
|
||||
public final int yystate() {
|
||||
return zzLexicalState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enters a new lexical state
|
||||
*
|
||||
* @param newState the new lexical state
|
||||
*/
|
||||
@Override
|
||||
public final void yybegin(int newState) {
|
||||
zzLexicalState = newState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the text matched by the current regular expression.
|
||||
*/
|
||||
public final String yytext() {
|
||||
return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character at position <tt>pos</tt> from the matched text.
|
||||
*
|
||||
* It is equivalent to yytext().charAt(pos), but faster
|
||||
*
|
||||
* @param pos the position of the character to fetch. A value from 0 to
|
||||
* yylength()-1.
|
||||
*
|
||||
* @return the character at position pos
|
||||
*/
|
||||
public final char yycharat(int pos) {
|
||||
return zzBuffer[zzStartRead + pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the length of the matched text region.
|
||||
*/
|
||||
public final int yylength() {
|
||||
return zzMarkedPos - zzStartRead;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports an error that occured while scanning.
|
||||
*
|
||||
* In a wellformed scanner (no or only correct usage of yypushback(int) and a
|
||||
* match-all fallback rule) this method will only be called with things that
|
||||
* "Can't Possibly Happen". If this method is called, something is seriously
|
||||
* wrong (e.g. a JFlex bug producing a faulty scanner etc.).
|
||||
*
|
||||
* Usual syntax/scanner level error handling should be done in error fallback
|
||||
* rules.
|
||||
*
|
||||
* @param errorCode the code of the errormessage to display
|
||||
*/
|
||||
private void zzScanError(int errorCode) {
|
||||
String message;
|
||||
try {
|
||||
message = ZZ_ERROR_MSG[errorCode];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
|
||||
}
|
||||
throw new Error(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes the specified amount of characters back into the input stream.
|
||||
*
|
||||
* They will be read again by then next call of the scanning method
|
||||
*
|
||||
* @param number the number of characters to be read again. This number must not
|
||||
* be greater than yylength()!
|
||||
*/
|
||||
public void yypushback(int number) {
|
||||
if (number > yylength())
|
||||
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||
zzMarkedPos -= number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resumes scanning until the next regular expression is matched, the end of
|
||||
* input is encountered or an I/O-Error occurs.
|
||||
*
|
||||
* @return the next token
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
|
||||
int zzInput;
|
||||
int zzAction;
|
||||
// cached fields:
|
||||
int zzCurrentPosL;
|
||||
int zzMarkedPosL;
|
||||
int zzEndReadL = zzEndRead;
|
||||
char[] zzBufferL = zzBuffer;
|
||||
char[] zzCMapL = ZZ_CMAP;
|
||||
int[] zzTransL = ZZ_TRANS;
|
||||
int[] zzRowMapL = ZZ_ROWMAP;
|
||||
int[] zzAttrL = ZZ_ATTRIBUTE;
|
||||
while (true) {
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzAction = -1;
|
||||
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
|
||||
zzState = zzLexicalState;
|
||||
zzForAction: {
|
||||
while (true) {
|
||||
if (zzCurrentPosL < zzEndReadL)
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
else if (zzAtEOF) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
// store back cached positions
|
||||
zzCurrentPos = zzCurrentPosL;
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
boolean eof = zzRefill();
|
||||
// get translated positions and possibly new buffer
|
||||
zzCurrentPosL = zzCurrentPos;
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzBufferL = zzBuffer;
|
||||
zzEndReadL = zzEndRead;
|
||||
if (eof) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
}
|
||||
}
|
||||
int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
|
||||
if (zzNext == -1)
|
||||
break zzForAction;
|
||||
zzState = zzNext;
|
||||
int zzAttributes = zzAttrL[zzState];
|
||||
if ((zzAttributes & 1) == 1) {
|
||||
zzAction = zzState;
|
||||
zzMarkedPosL = zzCurrentPosL;
|
||||
if ((zzAttributes & 8) == 8)
|
||||
break zzForAction;
|
||||
}
|
||||
}
|
||||
}
|
||||
// store back cached position
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||
case 7: {
|
||||
addToken(start, zzEndRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
return firstToken;
|
||||
}
|
||||
case 9:
|
||||
break;
|
||||
case 2: {
|
||||
start = zzMarkedPos;
|
||||
addToken(Token.OPERATOR);
|
||||
yybegin(VALUE);
|
||||
}
|
||||
case 10:
|
||||
break;
|
||||
case 8: {
|
||||
int temp = zzStartRead;
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
addToken(temp, zzMarkedPos - 1, Token.VARIABLE);
|
||||
start = zzMarkedPos;
|
||||
}
|
||||
case 11:
|
||||
break;
|
||||
case 3: {
|
||||
addToken(Token.WHITESPACE);
|
||||
}
|
||||
case 12:
|
||||
break;
|
||||
case 6: {
|
||||
addToken(start, zzMarkedPos - 1, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
start = zzMarkedPos;
|
||||
}
|
||||
case 13:
|
||||
break;
|
||||
case 1: {
|
||||
addToken(Token.RESERVED_WORD);
|
||||
}
|
||||
case 14:
|
||||
break;
|
||||
case 5: {
|
||||
}
|
||||
case 15:
|
||||
break;
|
||||
case 4: {
|
||||
addToken(Token.COMMENT_EOL);
|
||||
}
|
||||
case 16:
|
||||
break;
|
||||
default:
|
||||
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
|
||||
zzAtEOF = true;
|
||||
switch (zzLexicalState) {
|
||||
case YYINITIAL: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 14:
|
||||
break;
|
||||
case VALUE: {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 15:
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,438 +0,0 @@
|
||||
/*
|
||||
* 12/06/2005
|
||||
*
|
||||
* PythonTokenMaker.java - Token maker for the Python programming language.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
|
||||
import org.fife.ui.rsyntaxtextarea.Token;
|
||||
import org.fife.ui.rsyntaxtextarea.TokenMaker;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for the Python programming language.
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.3
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class PythonTokenMaker
|
||||
%extends AbstractJFlexTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public PythonTokenMaker() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "#", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = LONG_STRING_2;
|
||||
break;
|
||||
case Token.LITERAL_CHAR:
|
||||
state = LONG_STRING_1;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
/* This part is taken from http://www.python.org/doc/2.2.3/ref/grammar.txt */
|
||||
identifier = (({letter}|"_")({letter}|{digit}|"_")*)
|
||||
letter = ({lowercase}|{uppercase})
|
||||
lowercase = ([a-z])
|
||||
uppercase = ([A-Z])
|
||||
digit = ([0-9])
|
||||
stringliteral = ({stringprefix}?{shortstring})
|
||||
stringprefix = ("r"|"u"[rR]?|"R"|"U"[rR]?)
|
||||
shortstring1 = ([\']{shortstring1item}*[\']?)
|
||||
shortstring2 = ([\"]{shortstring2item}*[\"]?)
|
||||
shortstring = ({shortstring1}|{shortstring2})
|
||||
shortstring1item = ({shortstring1char}|{escapeseq})
|
||||
shortstring2item = ({shortstring2char}|{escapeseq})
|
||||
shortstring1char = ([^\\\n\'])
|
||||
shortstring2char = ([^\\\n\"])
|
||||
escapeseq = ([\\].)
|
||||
longinteger = ({integer}[lL])
|
||||
integer = ({decimalinteger}|{octinteger}|{hexinteger})
|
||||
decimalinteger = ({nonzerodigit}{digit}*|"0")
|
||||
octinteger = ("0"{octdigit}+)
|
||||
hexinteger = ("0"[xX]{hexdigit}+)
|
||||
nonzerodigit = ([1-9])
|
||||
octdigit = ([0-7])
|
||||
hexdigit = ({digit}|[a-f]|[A-F])
|
||||
floatnumber = ({pointfloat}|{exponentfloat})
|
||||
pointfloat = ({intpart}?{fraction}|{intpart}".")
|
||||
exponentfloat = (({intpart}|{pointfloat}){exponent})
|
||||
intpart = ({digit}+)
|
||||
fraction = ("."{digit}+)
|
||||
exponent = ([eE][\+\-]?{digit}+)
|
||||
imagnumber = (({floatnumber}|{intpart})[jJ])
|
||||
|
||||
ErrorNumberFormat = ({digit}{NonSeparator}+)
|
||||
NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#")
|
||||
|
||||
LongStringStart1 = ({stringprefix}?\'\'\')
|
||||
LongStringStart2 = ({stringprefix}?\"\"\")
|
||||
|
||||
LineTerminator = (\n)
|
||||
WhiteSpace = ([ \t\f])
|
||||
|
||||
LineComment = ("#".*)
|
||||
|
||||
|
||||
%state LONG_STRING_1
|
||||
%state LONG_STRING_2
|
||||
|
||||
|
||||
%%
|
||||
|
||||
/* Keywords */
|
||||
<YYINITIAL> "and" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "as" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "assert" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "break" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "class" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "continue" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "def" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "del" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "elif" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "else" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "except" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "exec" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "finally" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "for" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "from" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "global" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "if" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "import" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "in" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "is" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "lambda" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "not" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "or" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "pass" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "print" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "raise" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "return" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "try" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "while" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "yield" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
/* Data types. */
|
||||
<YYINITIAL> "char" { addToken(Token.DATA_TYPE); }
|
||||
<YYINITIAL> "double" { addToken(Token.DATA_TYPE); }
|
||||
<YYINITIAL> "float" { addToken(Token.DATA_TYPE); }
|
||||
<YYINITIAL> "int" { addToken(Token.DATA_TYPE); }
|
||||
<YYINITIAL> "long" { addToken(Token.DATA_TYPE); }
|
||||
<YYINITIAL> "short" { addToken(Token.DATA_TYPE); }
|
||||
<YYINITIAL> "signed" { addToken(Token.DATA_TYPE); }
|
||||
<YYINITIAL> "unsigned" { addToken(Token.DATA_TYPE); }
|
||||
<YYINITIAL> "void" { addToken(Token.DATA_TYPE); }
|
||||
|
||||
/* Standard functions */
|
||||
<YYINITIAL> "abs" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "apply" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "bool" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "buffer" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "callable" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "chr" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "classmethod" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "cmp" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "coerce" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "compile" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "complex" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "delattr" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "dict" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "dir" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "divmod" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "enumerate" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "eval" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "execfile" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "file" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "filter" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "float" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "getattr" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "globals" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "hasattr" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "hash" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "hex" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "id" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "input" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "int" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "intern" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "isinstance" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "issubclass" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "iter" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "len" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "list" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "locals" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "long" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "map" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "max" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "min" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "object" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "oct" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "open" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "ord" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "pow" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "property" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "range" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "raw_input" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "reduce" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "reload" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "repr" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "round" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "setattr" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "slice" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "staticmethod" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "str" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "sum" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "super" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "tuple" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "type" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "unichr" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "unicode" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "vars" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "xrange" { addToken(Token.FUNCTION); }
|
||||
<YYINITIAL> "zip" { addToken(Token.FUNCTION); }
|
||||
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
|
||||
{identifier} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
{WhiteSpace}+ { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* String/Character Literals. */
|
||||
{stringliteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
{LongStringStart1} { yybegin(LONG_STRING_1); addToken(Token.LITERAL_CHAR); }
|
||||
{LongStringStart2} { yybegin(LONG_STRING_2); addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
|
||||
/* Comment Literals. */
|
||||
{LineComment} { addToken(Token.COMMENT_EOL); }
|
||||
|
||||
/* Separators. */
|
||||
"(" { addToken(Token.SEPARATOR); }
|
||||
")" { addToken(Token.SEPARATOR); }
|
||||
"[" { addToken(Token.SEPARATOR); }
|
||||
"]" { addToken(Token.SEPARATOR); }
|
||||
"{" { addToken(Token.SEPARATOR); }
|
||||
"}" { addToken(Token.SEPARATOR); }
|
||||
|
||||
/* Operators. */
|
||||
"=" { addToken(Token.OPERATOR); }
|
||||
"+" { addToken(Token.OPERATOR); }
|
||||
"-" { addToken(Token.OPERATOR); }
|
||||
"*" { addToken(Token.OPERATOR); }
|
||||
"/" { addToken(Token.OPERATOR); }
|
||||
"%" { addToken(Token.OPERATOR); }
|
||||
"**" { addToken(Token.OPERATOR); }
|
||||
"~" { addToken(Token.OPERATOR); }
|
||||
"<" { addToken(Token.OPERATOR); }
|
||||
">" { addToken(Token.OPERATOR); }
|
||||
"<<" { addToken(Token.OPERATOR); }
|
||||
">>" { addToken(Token.OPERATOR); }
|
||||
"==" { addToken(Token.OPERATOR); }
|
||||
"+=" { addToken(Token.OPERATOR); }
|
||||
"-=" { addToken(Token.OPERATOR); }
|
||||
"*=" { addToken(Token.OPERATOR); }
|
||||
"/=" { addToken(Token.OPERATOR); }
|
||||
"%=" { addToken(Token.OPERATOR); }
|
||||
">>=" { addToken(Token.OPERATOR); }
|
||||
"<<=" { addToken(Token.OPERATOR); }
|
||||
"^" { addToken(Token.OPERATOR); }
|
||||
"&" { addToken(Token.OPERATOR); }
|
||||
"&&" { addToken(Token.OPERATOR); }
|
||||
"|" { addToken(Token.OPERATOR); }
|
||||
"||" { addToken(Token.OPERATOR); }
|
||||
"?" { addToken(Token.OPERATOR); }
|
||||
":" { addToken(Token.OPERATOR); }
|
||||
"," { addToken(Token.OPERATOR); }
|
||||
"!" { addToken(Token.OPERATOR); }
|
||||
"++" { addToken(Token.OPERATOR); }
|
||||
"--" { addToken(Token.OPERATOR); }
|
||||
"." { addToken(Token.OPERATOR); }
|
||||
"," { addToken(Token.OPERATOR); }
|
||||
|
||||
/* Numbers */
|
||||
{longinteger}|{integer} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{floatnumber}|{imagnumber} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
{ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
|
||||
|
||||
/* Other punctuation, we'll highlight it as "identifiers." */
|
||||
"@" { addToken(Token.IDENTIFIER); }
|
||||
";" { addToken(Token.IDENTIFIER); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters and flag them as bad. */
|
||||
. { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
<LONG_STRING_1> {
|
||||
[^\']+ { addToken(Token.LITERAL_CHAR); }
|
||||
"'''" { yybegin(YYINITIAL); addToken(Token.LITERAL_CHAR); }
|
||||
"'" { addToken(Token.LITERAL_CHAR); }
|
||||
<<EOF>> {
|
||||
if (firstToken==null) {
|
||||
addToken(Token.LITERAL_CHAR);
|
||||
}
|
||||
return firstToken;
|
||||
}
|
||||
}
|
||||
|
||||
<LONG_STRING_2> {
|
||||
[^\"]+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
\"\"\" { yybegin(YYINITIAL); addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
\" { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
<<EOF>> {
|
||||
if (firstToken==null) {
|
||||
addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
}
|
||||
return firstToken;
|
||||
}
|
||||
}
|
||||
@@ -1,857 +0,0 @@
|
||||
/* The following code was generated by JFlex 1.4.1 on 10/16/06 10:31 AM */
|
||||
/*
|
||||
* 12/06/2005
|
||||
* PythonTokenMaker.java - Token maker for the Python programming language.
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
|
||||
import org.fife.ui.rsyntaxtextarea.Token;
|
||||
import org.fife.ui.rsyntaxtextarea.TokenImpl;
|
||||
|
||||
/**
|
||||
* Scanner for the Python programming language.
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.3
|
||||
*/
|
||||
public class PythonTokenMaker extends AbstractJFlexTokenMaker {
|
||||
|
||||
/** This character denotes the end of file */
|
||||
public static final int YYEOF = -1;
|
||||
/** lexical states */
|
||||
public static final int YYINITIAL = 0;
|
||||
public static final int LONG_STRING_2 = 2;
|
||||
public static final int LONG_STRING_1 = 1;
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final String ZZ_CMAP_PACKED = "\11\0\1\34\1\12\1\0\1\34\1\32\22\0\1\34\1\64\1\11"
|
||||
+ "\1\33\1\0\1\63\1\67\1\10\1\57\1\57\1\62\1\61\1\64" + "\1\27\1\24\1\63\1\16\7\21\2\3\1\64\1\72\1\65\1\60"
|
||||
+ "\1\66\1\64\1\71\4\23\1\26\1\23\3\2\1\31\1\2\1\15" + "\5\2\1\6\2\2\1\7\2\2\1\20\2\2\1\57\1\13\1\57"
|
||||
+ "\1\64\1\1\1\0\1\35\1\42\1\44\1\37\1\25\1\22\1\52" + "\1\54\1\46\1\30\1\43\1\14\1\51\1\36\1\45\1\47\1\2"
|
||||
+ "\1\4\1\40\1\41\1\5\1\55\1\53\1\17\1\50\1\56\1\57" + "\1\70\1\57\1\64\uff81\0";
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
|
||||
/**
|
||||
* Translates DFA states to action switch labels.
|
||||
*/
|
||||
private static final int[] ZZ_ACTION = zzUnpackAction();
|
||||
private static final String ZZ_ACTION_PACKED_0 = "\3\0\1\1\1\2\1\3\4\2\2\4\1\5\1\2"
|
||||
+ "\1\3\2\2\1\6\1\2\1\6\1\7\1\10\21\2" + "\1\11\10\6\1\2\2\12\2\4\1\13\1\3\1\14"
|
||||
+ "\1\13\1\14\4\2\2\4\1\0\2\4\1\0\4\2" + "\1\13\1\3\1\13\12\2\1\15\27\2\1\15\3\2"
|
||||
+ "\2\15\1\16\1\15\15\2\3\0\2\14\1\0\12\2" + "\1\4\1\17\1\20\3\2\1\3\15\2\1\15\22\2"
|
||||
+ "\1\21\14\2\1\22\1\23\1\14\6\2\1\21\3\2" + "\1\15\36\2\1\15\17\2\1\15\6\2";
|
||||
|
||||
private static int[] zzUnpackAction() {
|
||||
int[] result = new int[265];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAction(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a state to a row index in the transition table
|
||||
*/
|
||||
private static final int[] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\73\0\166\0\261\0\354\0\u0127\0\u0162\0\u019d"
|
||||
+ "\0\u01d8\0\u0213\0\u024e\0\u0289\0\261\0\u02c4\0\u02ff\0\u033a"
|
||||
+ "\0\u0375\0\u03b0\0\u03eb\0\u0426\0\u0461\0\u049c\0\u04d7\0\u0512"
|
||||
+ "\0\u054d\0\u0588\0\u05c3\0\u05fe\0\u0639\0\u0674\0\u06af\0\u06ea"
|
||||
+ "\0\u0725\0\u0760\0\u079b\0\u07d6\0\u0811\0\u084c\0\u0887\0\261"
|
||||
+ "\0\u08c2\0\u08fd\0\u0938\0\261\0\u0973\0\u09ae\0\u09e9\0\u0a24"
|
||||
+ "\0\261\0\u0a5f\0\u0a9a\0\u0ad5\0\u0b10\0\u0b4b\0\u0b4b\0\u0b86"
|
||||
+ "\0\u0bc1\0\u0b4b\0\u0bfc\0\u0c37\0\u0c72\0\u0cad\0\u0ce8\0\u0d23"
|
||||
+ "\0\u0d5e\0\u0d99\0\u0dd4\0\u0e0f\0\u0e4a\0\u0e85\0\u0ec0\0\u0efb"
|
||||
+ "\0\u0f36\0\u0f71\0\u0fac\0\u0fe7\0\u1022\0\u105d\0\u1098\0\u10d3"
|
||||
+ "\0\u110e\0\u1149\0\u1184\0\u11bf\0\u11fa\0\u1235\0\u1270\0\u12ab"
|
||||
+ "\0\u12e6\0\u1321\0\u135c\0\u1397\0\u13d2\0\u140d\0\u1448\0\u1483"
|
||||
+ "\0\u14be\0\u14f9\0\u1534\0\u156f\0\u15aa\0\u15e5\0\u1620\0\u165b"
|
||||
+ "\0\u1696\0\u16d1\0\u170c\0\u1747\0\u1782\0\u17bd\0\u17f8\0\u1833"
|
||||
+ "\0\u186e\0\354\0\u18a9\0\354\0\u18e4\0\u191f\0\u195a\0\u1995"
|
||||
+ "\0\u19d0\0\u1a0b\0\u1a46\0\u1a81\0\u1abc\0\u1af7\0\u1b32\0\u1b6d"
|
||||
+ "\0\u1ba8\0\u1be3\0\u1c1e\0\u1c59\0\u1c94\0\261\0\u1ccf\0\u1d0a"
|
||||
+ "\0\u1d45\0\u1d80\0\u1dbb\0\u1df6\0\u1e31\0\u1e6c\0\u1ea7\0\u1ee2"
|
||||
+ "\0\u1f1d\0\u1f58\0\261\0\261\0\261\0\u1f93\0\u1fce\0\u2009"
|
||||
+ "\0\u2044\0\u207f\0\u20ba\0\u20f5\0\u2130\0\u216b\0\u21a6\0\u21e1"
|
||||
+ "\0\u221c\0\u2257\0\u2292\0\u22cd\0\u2308\0\u2343\0\u237e\0\u23b9"
|
||||
+ "\0\u23f4\0\u242f\0\u237e\0\u246a\0\u24a5\0\u24e0\0\u251b\0\u2556"
|
||||
+ "\0\u2591\0\u25cc\0\u2607\0\u2642\0\u267d\0\u26b8\0\u26f3\0\u272e"
|
||||
+ "\0\u2769\0\u27a4\0\u27df\0\u281a\0\u2855\0\u2890\0\u28cb\0\u2906"
|
||||
+ "\0\u2941\0\u297c\0\u29b7\0\u29f2\0\u2a2d\0\u2a68\0\261\0\261"
|
||||
+ "\0\u2aa3\0\u2ade\0\u2b19\0\u2b54\0\u17bd\0\u2b8f\0\u2bca\0\354"
|
||||
+ "\0\u2c05\0\u2c40\0\u2c7b\0\u2cb6\0\u2cf1\0\u2d2c\0\u2d67\0\u2da2"
|
||||
+ "\0\u2ddd\0\u2e18\0\u2e53\0\u2e8e\0\u2ec9\0\u2f04\0\u2f3f\0\u2f7a"
|
||||
+ "\0\u2fb5\0\u2ff0\0\u302b\0\u3066\0\u30a1\0\u30dc\0\u3117\0\u3152"
|
||||
+ "\0\u318d\0\u31c8\0\u3203\0\u323e\0\u3279\0\u32b4\0\u32ef\0\u332a"
|
||||
+ "\0\u3365\0\u33a0\0\u33db\0\u3416\0\u3451\0\u348c\0\u34c7\0\u3502"
|
||||
+ "\0\u353d\0\u3578\0\u35b3\0\u35ee\0\u33db\0\u3629\0\u3664\0\u369f"
|
||||
+ "\0\u36da\0\u3715\0\u1270\0\u3750\0\u378b\0\u37c6\0\u3801\0\u383c" + "\0\u3877";
|
||||
|
||||
private static int[] zzUnpackRowMap() {
|
||||
int[] result = new int[265];
|
||||
int offset = 0;
|
||||
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackRowMap(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int high = packed.charAt(i++) << 16;
|
||||
result[j++] = high | packed.charAt(i++);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* The transition table of the DFA
|
||||
*/
|
||||
private static final int[] ZZ_TRANS = zzUnpackTrans();
|
||||
private static final String ZZ_TRANS_PACKED_0 = "\1\4\2\5\1\6\1\7\1\10\1\11\1\12\1\13"
|
||||
+ "\1\14\1\15\1\4\1\16\1\5\1\17\1\20\1\5" + "\1\6\1\21\1\5\1\22\1\23\1\5\1\24\2\5"
|
||||
+ "\1\4\1\25\1\26\1\27\1\30\1\31\1\32\1\33" + "\1\34\1\5\1\35\1\36\1\37\1\40\1\41\1\42"
|
||||
+ "\1\43\1\44\1\45\1\46\1\47\1\50\1\51\1\52" + "\1\53\1\51\1\54\1\55\1\56\1\57\1\60\2\61"
|
||||
+ "\10\62\1\63\62\62\11\64\1\65\61\64\74\0\7\5" + "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\22\5"
|
||||
+ "\14\0\3\66\1\6\4\66\3\0\1\66\2\67\1\6" + "\2\66\1\6\2\66\1\70\2\71\1\0\2\72\1\0"
|
||||
+ "\1\66\1\0\22\66\12\0\1\66\2\0\7\5\1\13" + "\1\14\2\0\10\5\1\0\1\73\1\5\1\0\2\5"
|
||||
+ "\3\0\1\74\7\5\1\75\11\5\15\0\3\5\1\11" + "\1\5\1\11\1\5\1\13\1\14\2\0\10\5\1\0"
|
||||
+ "\2\5\1\0\2\5\3\0\1\5\1\76\20\5\15\0" + "\7\5\1\13\1\14\2\0\10\5\1\0\2\5\1\0"
|
||||
+ "\2\5\3\0\22\5\15\0\3\5\1\11\1\5\1\11" + "\1\5\1\13\1\14\2\0\10\5\1\0\2\5\1\0"
|
||||
+ "\2\5\3\0\22\5\14\0\10\77\1\100\1\77\1\0" + "\1\101\57\77\11\102\1\103\1\0\1\104\57\102\1\0"
|
||||
+ "\7\5\4\0\10\5\1\0\1\105\1\5\1\0\2\5" + "\3\0\1\106\7\5\1\107\1\110\10\5\14\0\3\66"
|
||||
+ "\1\111\4\66\3\0\1\66\2\67\1\112\2\113\1\112" + "\2\66\1\70\2\71\1\0\2\72\1\0\1\66\1\0"
|
||||
+ "\22\66\12\0\1\66\2\0\3\5\1\114\3\5\4\0" + "\10\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"
|
||||
+ "\3\5\1\115\3\5\4\0\1\116\7\5\1\0\2\5" + "\1\0\2\5\3\0\10\5\1\117\1\120\10\5\17\0"
|
||||
+ "\1\70\12\0\1\70\2\0\1\70\52\0\7\5\4\0" + "\1\121\2\5\1\122\4\5\1\0\2\5\1\0\2\5"
|
||||
+ "\3\0\1\5\1\123\16\5\1\124\1\5\43\0\1\54" + "\30\0\1\54\12\0\12\25\1\0\60\25\34\0\1\26"
|
||||
+ "\37\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5" + "\3\0\1\5\1\125\1\5\1\126\1\5\1\127\4\5"
|
||||
+ "\1\130\7\5\15\0\7\5\4\0\10\5\1\0\2\5" + "\1\0\2\5\3\0\10\5\1\131\11\5\15\0\7\5"
|
||||
+ "\4\0\10\5\1\0\1\132\1\5\1\0\2\5\3\0" + "\10\5\1\133\1\134\10\5\15\0\4\5\1\135\2\5"
|
||||
+ "\4\0\1\136\7\5\1\0\1\137\1\5\1\0\2\5" + "\3\0\4\5\1\140\4\5\1\141\5\5\1\142\2\5"
|
||||
+ "\15\0\3\5\1\143\1\144\2\5\4\0\10\5\1\0" + "\2\5\1\0\2\5\3\0\13\5\1\145\6\5\15\0"
|
||||
+ "\3\5\1\146\1\147\2\5\4\0\10\5\1\0\2\5" + "\1\0\2\5\3\0\10\5\1\150\11\5\15\0\7\5"
|
||||
+ "\4\0\1\151\7\5\1\0\2\5\1\0\2\5\3\0" + "\1\152\7\5\1\153\3\5\1\154\2\5\1\155\2\5"
|
||||
+ "\15\0\3\5\1\156\3\5\4\0\10\5\1\0\2\5" + "\1\0\2\5\3\0\5\5\1\157\1\5\1\160\2\5"
|
||||
+ "\1\161\7\5\15\0\7\5\4\0\6\5\1\162\1\5" + "\1\0\2\5\1\0\2\5\3\0\1\5\1\163\1\164"
|
||||
+ "\1\165\1\166\7\5\1\167\5\5\15\0\3\5\1\170" + "\3\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"
|
||||
+ "\1\171\7\5\1\172\11\5\15\0\7\5\4\0\10\5" + "\1\0\2\5\1\0\2\5\3\0\11\5\1\173\10\5"
|
||||
+ "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5" + "\3\0\1\174\10\5\1\105\10\5\15\0\7\5\4\0"
|
||||
+ "\1\175\7\5\1\0\1\137\1\5\1\0\2\5\3\0" + "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"
|
||||
+ "\2\5\3\0\17\5\1\176\2\5\15\0\7\5\4\0" + "\10\5\1\0\1\177\1\5\1\0\2\5\3\0\1\200"
|
||||
+ "\21\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0" + "\2\5\3\0\1\201\7\5\1\202\11\5\15\0\7\5"
|
||||
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\11\5" + "\1\154\10\5\74\0\1\54\72\0\2\54\71\0\1\54"
|
||||
+ "\1\0\1\54\75\0\1\51\73\0\1\51\73\0\1\54" + "\73\0\1\54\2\0\10\62\1\0\62\62\10\0\1\203"
|
||||
+ "\62\0\11\64\1\0\61\64\11\0\1\204\61\0\10\66" + "\3\0\11\66\1\0\2\66\1\0\2\66\1\0\1\66"
|
||||
+ "\1\0\22\66\12\0\1\66\4\0\1\70\12\0\1\70" + "\2\0\1\70\3\0\2\205\1\0\2\206\41\0\3\66"
|
||||
+ "\1\207\4\66\3\0\3\66\1\207\2\66\1\207\2\66" + "\1\0\2\66\1\210\2\66\1\0\1\66\1\0\22\66"
|
||||
+ "\2\0\1\210\7\0\1\66\2\0\7\5\4\0\1\211" + "\7\5\1\0\2\5\1\0\2\5\3\0\2\5\1\212"
|
||||
+ "\1\5\1\213\5\5\1\214\7\5\15\0\7\5\4\0" + "\10\5\1\0\2\5\1\0\2\5\3\0\1\5\1\215"
|
||||
+ "\7\5\1\216\4\5\1\217\3\5\15\0\4\5\1\220" + "\2\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"
|
||||
+ "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0" + "\2\5\3\0\3\5\1\221\5\5\1\222\10\5\14\0"
|
||||
+ "\10\77\1\223\1\77\1\0\1\101\57\77\10\0\1\224" + "\62\0\12\77\1\0\60\77\11\102\1\223\1\0\1\104"
|
||||
+ "\57\102\11\0\1\225\61\0\12\102\1\0\60\102\1\0" + "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"
|
||||
+ "\1\5\1\164\20\5\15\0\7\5\4\0\10\5\1\0" + "\2\5\1\0\2\5\3\0\14\5\1\226\5\5\15\0"
|
||||
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0" + "\1\5\1\227\5\5\1\230\12\5\15\0\7\5\4\0"
|
||||
+ "\10\5\1\0\2\5\1\0\2\5\3\0\3\5\1\160" + "\16\5\14\0\3\66\1\111\4\66\3\0\3\66\1\111"
|
||||
+ "\2\66\1\111\2\66\1\70\2\71\1\0\2\72\1\0" + "\1\66\1\0\22\66\12\0\1\66\1\0\3\66\1\111"
|
||||
+ "\4\66\3\0\1\66\2\67\1\112\2\66\1\112\2\66" + "\1\70\2\71\1\0\2\72\1\0\1\66\1\0\22\66"
|
||||
+ "\12\0\1\66\1\0\3\66\1\231\4\66\3\0\3\66" + "\1\231\2\66\3\231\1\0\2\231\1\0\2\66\1\0"
|
||||
+ "\1\66\1\0\1\231\1\66\1\231\2\66\1\231\1\66" + "\1\231\12\66\12\0\1\66\2\0\7\5\4\0\10\5"
|
||||
+ "\1\0\2\5\1\0\2\5\3\0\1\232\21\5\15\0" + "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"
|
||||
+ "\10\5\1\233\11\5\15\0\7\5\4\0\10\5\1\0" + "\2\5\1\0\2\5\3\0\10\5\1\234\11\5\15\0"
|
||||
+ "\3\5\1\162\3\5\4\0\10\5\1\0\2\5\1\0" + "\2\5\3\0\22\5\15\0\7\5\4\0\1\235\7\5"
|
||||
+ "\1\0\2\5\1\0\2\5\3\0\1\5\1\236\20\5" + "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"
|
||||
+ "\3\0\3\5\1\237\5\5\1\240\10\5\15\0\7\5" + "\4\0\10\5\1\0\1\241\1\5\1\0\2\5\3\0"
|
||||
+ "\7\5\1\242\12\5\15\0\4\5\1\243\2\5\4\0" + "\10\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"
|
||||
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0" + "\1\244\21\5\15\0\7\5\4\0\10\5\1\0\2\5"
|
||||
+ "\1\0\2\5\3\0\2\5\1\162\17\5\15\0\7\5" + "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\3\5"
|
||||
+ "\1\245\16\5\15\0\7\5\4\0\10\5\1\0\2\5" + "\1\0\2\5\3\0\3\5\1\164\16\5\15\0\7\5"
|
||||
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5" + "\1\246\7\5\15\0\7\5\4\0\10\5\1\0\2\5"
|
||||
+ "\1\0\2\5\3\0\4\5\1\162\15\5\15\0\7\5" + "\4\0\1\247\5\5\1\162\1\5\1\0\2\5\1\0"
|
||||
+ "\2\5\3\0\22\5\15\0\4\5\1\250\2\5\4\0" + "\10\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"
|
||||
+ "\3\5\1\164\3\5\4\0\10\5\1\0\2\5\1\0" + "\2\5\3\0\7\5\1\160\10\5\1\251\1\5\15\0"
|
||||
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0" + "\12\5\1\166\1\5\1\164\5\5\15\0\7\5\4\0"
|
||||
+ "\10\5\1\0\2\5\1\0\2\5\3\0\11\5\1\252" + "\10\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"
|
||||
+ "\2\5\3\0\4\5\1\253\15\5\15\0\3\5\1\164" + "\3\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"
|
||||
+ "\1\254\21\5\15\0\7\5\4\0\10\5\1\0\2\5" + "\1\0\2\5\3\0\15\5\1\255\4\5\15\0\7\5"
|
||||
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\10\5" + "\1\256\11\5\15\0\7\5\4\0\10\5\1\0\2\5"
|
||||
+ "\1\0\2\5\3\0\13\5\1\162\6\5\15\0\7\5" + "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"
|
||||
+ "\1\257\7\5\15\0\7\5\4\0\10\5\1\0\2\5" + "\1\0\2\5\3\0\12\5\1\260\7\5\15\0\7\5"
|
||||
+ "\4\0\10\5\1\0\1\261\1\5\1\0\2\5\3\0" + "\22\5\15\0\7\5\4\0\6\5\1\262\1\5\1\0"
|
||||
+ "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0" + "\10\5\1\0\2\5\1\0\2\5\3\0\10\5\1\244"
|
||||
+ "\11\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0" + "\2\5\3\0\1\263\21\5\15\0\7\5\4\0\1\264"
|
||||
+ "\7\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0" + "\7\5\4\0\10\5\1\0\1\265\1\5\1\0\2\5"
|
||||
+ "\3\0\1\5\1\266\12\5\1\267\5\5\15\0\7\5" + "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"
|
||||
+ "\1\164\7\5\15\0\3\5\1\164\3\5\4\0\10\5" + "\1\0\2\5\1\0\2\5\3\0\1\270\21\5\15\0"
|
||||
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0" + "\2\5\1\164\17\5\15\0\7\5\4\0\10\5\1\0"
|
||||
+ "\2\5\1\0\1\271\1\5\3\0\22\5\15\0\7\5" + "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\4\5"
|
||||
+ "\1\164\15\5\15\0\7\5\4\0\10\5\1\0\1\105" + "\1\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"
|
||||
+ "\10\5\1\0\2\5\1\0\2\5\3\0\4\5\1\272" + "\5\5\1\273\7\5\15\0\7\5\4\0\10\5\1\0"
|
||||
+ "\2\5\1\0\2\5\3\0\3\5\1\274\5\5\1\275" + "\10\5\15\0\7\5\4\0\10\5\1\0\1\214\1\5"
|
||||
+ "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5" + "\1\0\2\5\1\0\2\5\3\0\12\5\1\276\7\5"
|
||||
+ "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5" + "\3\0\10\5\1\277\1\300\10\5\15\0\7\5\4\0"
|
||||
+ "\10\5\1\0\2\5\1\0\2\5\3\0\3\5\1\301" + "\16\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"
|
||||
+ "\2\5\3\0\16\5\1\164\3\5\15\0\7\5\4\0" + "\10\5\1\0\1\302\1\5\1\0\2\5\3\0\22\5"
|
||||
+ "\15\0\7\5\4\0\3\5\1\164\4\5\1\0\2\5" + "\1\0\2\5\3\0\12\5\1\164\7\5\15\0\7\5"
|
||||
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\10\5" + "\1\303\11\5\15\0\7\5\4\0\10\5\1\0\2\5"
|
||||
+ "\1\0\2\5\3\0\11\5\1\304\10\5\15\0\7\5" + "\4\0\3\5\1\164\4\5\1\0\2\5\1\0\2\5"
|
||||
+ "\3\0\22\5\15\0\7\5\4\0\10\5\1\0\2\5" + "\1\0\2\5\3\0\3\5\1\305\16\5\15\0\3\5"
|
||||
+ "\1\127\3\5\4\0\10\5\1\0\2\5\1\0\2\5" + "\3\0\22\5\15\0\7\5\4\0\10\5\1\0\2\5"
|
||||
+ "\1\0\2\5\3\0\11\5\1\306\10\5\24\0\1\307" + "\73\0\1\310\64\0\1\311\12\0\1\311\2\0\1\311"
|
||||
+ "\5\0\1\210\31\0\1\210\11\0\3\66\1\207\4\66" + "\3\0\3\66\1\207\2\66\1\207\2\66\1\0\2\66"
|
||||
+ "\1\0\2\72\1\0\1\66\1\0\22\66\12\0\1\66" + "\4\0\1\311\12\0\1\311\2\0\1\311\52\0\7\5"
|
||||
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\10\5" + "\1\312\11\5\15\0\4\5\1\252\2\5\4\0\10\5"
|
||||
+ "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\4\5" + "\1\313\2\5\4\0\10\5\1\0\2\5\1\0\2\5"
|
||||
+ "\3\0\22\5\15\0\3\5\1\164\3\5\4\0\10\5" + "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\7\5"
|
||||
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\15\5" + "\1\260\4\5\15\0\7\5\4\0\10\5\1\0\2\5"
|
||||
+ "\1\0\2\5\3\0\3\5\1\237\16\5\15\0\1\314" + "\6\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"
|
||||
+ "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0" + "\2\5\3\0\1\5\1\315\20\5\15\0\7\5\4\0"
|
||||
+ "\10\5\1\0\2\5\1\0\2\5\3\0\11\5\1\141" + "\10\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"
|
||||
+ "\2\5\3\0\7\5\1\316\12\5\15\0\7\5\4\0" + "\10\5\1\0\2\5\1\0\2\5\3\0\5\5\1\317"
|
||||
+ "\14\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0" + "\2\5\3\0\15\5\1\320\4\5\15\0\7\5\4\0"
|
||||
+ "\10\5\1\0\2\5\1\0\2\5\3\0\1\321\21\5" + "\14\0\3\66\1\231\4\66\3\0\1\66\2\67\1\231"
|
||||
+ "\2\66\3\231\1\0\2\231\1\0\2\66\1\0\1\66" + "\1\0\1\231\1\66\1\231\2\66\1\231\1\66\1\231"
|
||||
+ "\12\66\12\0\1\66\2\0\7\5\4\0\10\5\1\0" + "\2\5\1\0\2\5\3\0\1\5\1\215\20\5\15\0"
|
||||
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0" + "\14\5\1\162\5\5\15\0\7\5\4\0\10\5\1\0"
|
||||
+ "\2\5\1\0\2\5\3\0\1\322\21\5\15\0\7\5" + "\4\0\10\5\1\0\1\164\1\5\1\0\2\5\3\0"
|
||||
+ "\4\5\1\166\15\5\15\0\7\5\4\0\10\5\1\0" + "\2\5\1\0\2\5\3\0\1\323\21\5\15\0\7\5"
|
||||
+ "\4\0\10\5\1\0\1\162\1\5\1\0\2\5\3\0" + "\22\5\15\0\7\5\4\0\6\5\1\162\1\5\1\0"
|
||||
+ "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0" + "\10\5\1\0\2\5\1\0\2\5\3\0\7\5\1\324"
|
||||
+ "\12\5\15\0\7\5\4\0\10\5\1\0\1\325\1\5" + "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"
|
||||
+ "\1\0\2\5\1\0\2\5\3\0\14\5\1\326\5\5" + "\15\0\7\5\4\0\1\164\7\5\1\0\2\5\1\0"
|
||||
+ "\2\5\3\0\22\5\15\0\7\5\4\0\10\5\1\0" + "\1\327\1\5\1\0\2\5\3\0\22\5\15\0\7\5"
|
||||
+ "\4\0\1\330\7\5\1\0\2\5\1\0\2\5\3\0" + "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"
|
||||
+ "\2\5\3\0\1\331\21\5\15\0\7\5\4\0\10\5" + "\1\0\2\5\1\0\2\5\3\0\5\5\1\332\14\5"
|
||||
+ "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5" + "\3\0\14\5\1\333\5\5\15\0\7\5\4\0\10\5"
|
||||
+ "\1\0\2\5\1\0\2\5\3\0\7\5\1\260\12\5" + "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"
|
||||
+ "\3\0\4\5\1\334\15\5\15\0\7\5\4\0\10\5" + "\1\0\2\5\1\0\2\5\3\0\1\5\1\335\20\5"
|
||||
+ "\15\0\3\5\1\322\3\5\4\0\10\5\1\0\2\5" + "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\1\260"
|
||||
+ "\7\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0" + "\7\5\4\0\10\5\1\0\1\164\1\5\1\0\2\5"
|
||||
+ "\3\0\22\5\15\0\7\5\4\0\10\5\1\0\2\5" + "\1\0\2\5\3\0\1\336\21\5\15\0\7\5\4\0"
|
||||
+ "\6\5\1\166\1\5\1\0\2\5\1\0\2\5\3\0" + "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"
|
||||
+ "\2\5\3\0\3\5\1\337\16\5\15\0\7\5\4\0" + "\1\340\7\5\1\0\2\5\1\0\2\5\3\0\22\5"
|
||||
+ "\15\0\3\5\1\252\3\5\4\0\10\5\1\0\2\5" + "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"
|
||||
+ "\1\0\2\5\1\0\2\5\3\0\4\5\1\341\15\5" + "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"
|
||||
+ "\3\0\12\5\1\342\7\5\15\0\3\5\1\320\3\5" + "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\22\5"
|
||||
+ "\15\0\7\5\4\0\10\5\1\0\1\343\1\5\1\0" + "\2\5\3\0\22\5\15\0\7\5\4\0\10\5\1\0"
|
||||
+ "\1\344\1\5\1\0\2\5\3\0\22\5\15\0\4\5" + "\1\160\2\5\4\0\10\5\1\0\2\5\1\0\2\5"
|
||||
+ "\3\0\22\5\15\0\4\5\1\345\2\5\4\0\10\5" + "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\7\5"
|
||||
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\1\5" + "\1\346\20\5\15\0\7\5\4\0\10\5\1\0\2\5"
|
||||
+ "\1\0\2\5\3\0\10\5\1\327\11\5\15\0\7\5" + "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"
|
||||
+ "\1\347\7\5\15\0\7\5\4\0\10\5\1\0\2\5" + "\1\0\2\5\3\0\1\5\1\131\20\5\15\0\7\5"
|
||||
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\3\5" + "\1\162\16\5\15\0\7\5\4\0\1\125\7\5\1\0"
|
||||
+ "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0" + "\10\5\1\0\2\5\1\0\2\5\3\0\5\5\1\350"
|
||||
+ "\14\5\15\0\7\5\4\0\1\237\7\5\1\0\2\5" + "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"
|
||||
+ "\1\0\2\5\1\0\2\5\3\0\1\331\16\5\1\164" + "\2\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"
|
||||
+ "\2\5\3\0\2\5\1\320\17\5\17\0\1\311\12\0" + "\1\311\2\0\1\311\6\0\2\206\42\0\7\5\4\0"
|
||||
+ "\10\5\1\0\2\5\1\0\2\5\3\0\1\315\21\5" + "\15\0\3\5\1\351\3\5\4\0\10\5\1\0\2\5"
|
||||
+ "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5" + "\1\0\2\5\1\0\2\5\3\0\11\5\1\352\10\5"
|
||||
+ "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5" + "\3\0\10\5\1\353\6\5\1\214\2\5\15\0\7\5"
|
||||
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\2\5" + "\1\354\17\5\15\0\7\5\4\0\1\127\7\5\1\0"
|
||||
+ "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0" + "\10\5\1\0\2\5\1\0\2\5\3\0\4\5\1\320"
|
||||
+ "\15\5\15\0\7\5\4\0\1\355\7\5\1\0\2\5" + "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\6\5"
|
||||
+ "\1\356\1\5\1\0\2\5\1\0\2\5\3\0\22\5" + "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"
|
||||
+ "\3\0\12\5\1\131\7\5\15\0\7\5\4\0\10\5" + "\1\0\1\357\1\5\1\0\2\5\3\0\22\5\15\0"
|
||||
+ "\3\5\1\131\3\5\4\0\10\5\1\0\2\5\1\0" + "\2\5\3\0\22\5\15\0\7\5\4\0\10\5\1\0"
|
||||
+ "\2\5\1\0\2\5\3\0\13\5\1\164\6\5\15\0" + "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"
|
||||
+ "\4\5\1\360\15\5\15\0\7\5\4\0\1\361\7\5" + "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\7\5"
|
||||
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\10\5" + "\1\315\11\5\15\0\7\5\4\0\10\5\1\0\2\5"
|
||||
+ "\1\0\2\5\3\0\11\5\1\362\10\5\15\0\7\5" + "\4\0\10\5\1\0\1\306\1\5\1\0\2\5\3\0"
|
||||
+ "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0" + "\2\5\3\0\6\5\1\162\13\5\15\0\7\5\4\0"
|
||||
+ "\10\5\1\0\2\5\1\0\2\5\3\0\3\5\1\363" + "\16\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"
|
||||
+ "\2\5\3\0\1\364\21\5\15\0\7\5\4\0\10\5" + "\1\0\2\5\1\0\2\5\3\0\11\5\1\365\10\5"
|
||||
+ "\15\0\7\5\4\0\1\366\7\5\1\0\2\5\1\0" + "\2\5\3\0\11\5\1\257\10\5\15\0\7\5\4\0"
|
||||
+ "\10\5\1\0\2\5\1\0\2\5\3\0\7\5\1\160" + "\12\5\15\0\3\5\1\105\3\5\4\0\10\5\1\0"
|
||||
+ "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0" + "\10\5\1\0\2\5\1\0\2\5\3\0\5\5\1\367"
|
||||
+ "\14\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0" + "\2\5\3\0\3\5\1\370\16\5\15\0\7\5\4\0"
|
||||
+ "\10\5\1\0\1\371\1\5\1\0\2\5\3\0\22\5" + "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"
|
||||
+ "\3\0\1\372\21\5\15\0\7\5\4\0\10\5\1\0" + "\2\5\1\0\2\5\3\0\1\5\1\162\20\5\15\0"
|
||||
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0" + "\1\5\1\373\20\5\15\0\7\5\4\0\10\5\1\0"
|
||||
+ "\2\5\1\0\2\5\3\0\2\5\1\260\17\5\15\0" + "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"
|
||||
+ "\1\162\21\5\15\0\7\5\4\0\1\143\7\5\1\0" + "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"
|
||||
+ "\10\5\1\0\2\5\1\0\2\5\3\0\11\5\1\257" + "\10\5\15\0\3\5\1\374\3\5\4\0\10\5\1\0"
|
||||
+ "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0" + "\10\5\1\0\2\5\1\0\2\5\3\0\4\5\1\214"
|
||||
+ "\15\5\15\0\7\5\4\0\10\5\1\0\1\320\1\5" + "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"
|
||||
+ "\1\0\2\5\1\0\2\5\3\0\7\5\1\375\12\5" + "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"
|
||||
+ "\3\0\14\5\1\376\5\5\15\0\7\5\4\0\10\5" + "\1\0\2\5\1\0\2\5\3\0\5\5\1\257\14\5"
|
||||
+ "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5" + "\3\0\1\5\1\377\20\5\15\0\7\5\4\0\10\5"
|
||||
+ "\1\0\1\177\1\5\1\0\2\5\3\0\22\5\15\0" + "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"
|
||||
+ "\7\5\1\u0100\12\5\15\0\7\5\4\0\10\5\1\0" + "\2\5\1\0\2\5\3\0\4\5\1\u0101\15\5\15\0"
|
||||
+ "\3\5\1\u0102\3\5\4\0\10\5\1\0\2\5\1\0" + "\2\5\3\0\22\5\15\0\7\5\4\0\1\u0103\7\5"
|
||||
+ "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\7\5" + "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"
|
||||
+ "\1\273\7\5\15\0\7\5\4\0\10\5\1\0\2\5" + "\1\0\2\5\3\0\1\u0104\21\5\15\0\7\5\4\0"
|
||||
+ "\10\5\1\0\1\u0105\1\5\1\0\2\5\3\0\22\5" + "\15\0\4\5\1\237\2\5\4\0\10\5\1\0\2\5"
|
||||
+ "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\1\u0106" + "\7\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"
|
||||
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0" + "\1\u0107\21\5\15\0\7\5\4\0\10\5\1\0\2\5"
|
||||
+ "\1\0\2\5\3\0\4\5\1\330\15\5\15\0\7\5" + "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\4\5"
|
||||
+ "\1\260\15\5\15\0\7\5\4\0\10\5\1\0\2\5" + "\1\0\2\5\3\0\4\5\1\u0108\15\5\15\0\7\5"
|
||||
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\1\u0109" + "\21\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"
|
||||
+ "\2\5\3\0\1\5\1\252\20\5\15\0\7\5\4\0" + "\10\5\1\0\2\5\1\0\2\5\3\0\17\5\1\333"
|
||||
+ "\2\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0" + "\2\5\3\0\3\5\1\127\16\5\14\0";
|
||||
|
||||
private static int[] zzUnpackTrans() {
|
||||
int[] result = new int[14514];
|
||||
int offset = 0;
|
||||
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackTrans(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
value--;
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/* error codes */
|
||||
private static final int ZZ_UNKNOWN_ERROR = 0;
|
||||
private static final int ZZ_NO_MATCH = 1;
|
||||
private static final int ZZ_PUSHBACK_2BIG = 2;
|
||||
/* error messages for the codes above */
|
||||
private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input",
|
||||
"Error: pushback value was too large" };
|
||||
/**
|
||||
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
|
||||
*/
|
||||
private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 = "\3\0\1\11\10\1\1\11\32\1\1\11\3\1\1\11"
|
||||
+ "\4\1\1\11\17\1\1\0\2\1\1\0\76\1\3\0" + "\1\11\1\1\1\0\12\1\3\11\61\1\2\11\101\1";
|
||||
|
||||
private static int[] zzUnpackAttribute() {
|
||||
int[] result = new int[265];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAttribute(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/** the input device */
|
||||
private java.io.Reader zzReader;
|
||||
/** the current state of the DFA */
|
||||
private int zzState;
|
||||
/** the current lexical state */
|
||||
private int zzLexicalState = YYINITIAL;
|
||||
/**
|
||||
* this buffer contains the current text to be matched and is the source of the
|
||||
* yytext() string
|
||||
*/
|
||||
private char zzBuffer[];
|
||||
/** the textposition at the last accepting state */
|
||||
private int zzMarkedPos;
|
||||
/** the current text position in the buffer */
|
||||
private int zzCurrentPos;
|
||||
/** startRead marks the beginning of the yytext() string in the buffer */
|
||||
private int zzStartRead;
|
||||
/**
|
||||
* endRead marks the last character in the buffer, that has been read from input
|
||||
*/
|
||||
private int zzEndRead;
|
||||
/** zzAtEOF == true <=> the scanner is at the EOF */
|
||||
private boolean zzAtEOF;
|
||||
/* user code: */
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a no-parameter
|
||||
* constructor.
|
||||
*/
|
||||
public PythonTokenMaker() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos - 1, tokenType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start, end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "#", null };
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated from
|
||||
* <code>text</code>. This method must be implemented by subclasses so they can
|
||||
* correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing the syntax
|
||||
* highlighted text.
|
||||
*/
|
||||
@Override
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = LONG_STRING_2;
|
||||
break;
|
||||
case Token.LITERAL_CHAR:
|
||||
state = LONG_STRING_1;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream. Does not close the old
|
||||
* reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream <b>cannot</b> be
|
||||
* reused (internal buffer is discarded and lost). Lexical state is set to
|
||||
* <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill no longer
|
||||
* "refills" the buffer (since the way we do it, it's always "full" the first
|
||||
* time through, since it points to the segment's array). So, we assign
|
||||
* zzEndRead here.
|
||||
*/
|
||||
// zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos >= s.offset + s.count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner There is also a java.io.InputStream version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
public PythonTokenMaker(java.io.Reader in) {
|
||||
this.zzReader = in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner. There is also java.io.Reader version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Inputstream to read input from.
|
||||
*/
|
||||
public PythonTokenMaker(java.io.InputStream in) {
|
||||
this(new java.io.InputStreamReader(in));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unpacks the compressed character translation table.
|
||||
*
|
||||
* @param packed the packed character translation table
|
||||
* @return the unpacked character translation table
|
||||
*/
|
||||
private static char[] zzUnpackCMap(String packed) {
|
||||
char[] map = new char[0x10000];
|
||||
int i = 0; /* index in packed string */
|
||||
int j = 0; /* index in unpacked array */
|
||||
while (i < 168) {
|
||||
int count = packed.charAt(i++);
|
||||
char value = packed.charAt(i++);
|
||||
do
|
||||
map[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the input stream.
|
||||
*/
|
||||
public final void yyclose() throws java.io.IOException {
|
||||
zzAtEOF = true; /* indicate end of file */
|
||||
zzEndRead = zzStartRead; /* invalidate buffer */
|
||||
if (zzReader != null)
|
||||
zzReader.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current lexical state.
|
||||
*/
|
||||
public final int yystate() {
|
||||
return zzLexicalState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enters a new lexical state
|
||||
*
|
||||
* @param newState the new lexical state
|
||||
*/
|
||||
@Override
|
||||
public final void yybegin(int newState) {
|
||||
zzLexicalState = newState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the text matched by the current regular expression.
|
||||
*/
|
||||
public final String yytext() {
|
||||
return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character at position <tt>pos</tt> from the matched text.
|
||||
*
|
||||
* It is equivalent to yytext().charAt(pos), but faster
|
||||
*
|
||||
* @param pos the position of the character to fetch. A value from 0 to
|
||||
* yylength()-1.
|
||||
*
|
||||
* @return the character at position pos
|
||||
*/
|
||||
public final char yycharat(int pos) {
|
||||
return zzBuffer[zzStartRead + pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the length of the matched text region.
|
||||
*/
|
||||
public final int yylength() {
|
||||
return zzMarkedPos - zzStartRead;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports an error that occured while scanning.
|
||||
*
|
||||
* In a wellformed scanner (no or only correct usage of yypushback(int) and a
|
||||
* match-all fallback rule) this method will only be called with things that
|
||||
* "Can't Possibly Happen". If this method is called, something is seriously
|
||||
* wrong (e.g. a JFlex bug producing a faulty scanner etc.).
|
||||
*
|
||||
* Usual syntax/scanner level error handling should be done in error fallback
|
||||
* rules.
|
||||
*
|
||||
* @param errorCode the code of the errormessage to display
|
||||
*/
|
||||
private void zzScanError(int errorCode) {
|
||||
String message;
|
||||
try {
|
||||
message = ZZ_ERROR_MSG[errorCode];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
|
||||
}
|
||||
throw new Error(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes the specified amount of characters back into the input stream.
|
||||
*
|
||||
* They will be read again by then next call of the scanning method
|
||||
*
|
||||
* @param number the number of characters to be read again. This number must not
|
||||
* be greater than yylength()!
|
||||
*/
|
||||
public void yypushback(int number) {
|
||||
if (number > yylength())
|
||||
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||
zzMarkedPos -= number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resumes scanning until the next regular expression is matched, the end of
|
||||
* input is encountered or an I/O-Error occurs.
|
||||
*
|
||||
* @return the next token
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
|
||||
int zzInput;
|
||||
int zzAction;
|
||||
// cached fields:
|
||||
int zzCurrentPosL;
|
||||
int zzMarkedPosL;
|
||||
int zzEndReadL = zzEndRead;
|
||||
char[] zzBufferL = zzBuffer;
|
||||
char[] zzCMapL = ZZ_CMAP;
|
||||
int[] zzTransL = ZZ_TRANS;
|
||||
int[] zzRowMapL = ZZ_ROWMAP;
|
||||
int[] zzAttrL = ZZ_ATTRIBUTE;
|
||||
while (true) {
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzAction = -1;
|
||||
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
|
||||
zzState = zzLexicalState;
|
||||
zzForAction: {
|
||||
while (true) {
|
||||
if (zzCurrentPosL < zzEndReadL)
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
else if (zzAtEOF) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
// store back cached positions
|
||||
zzCurrentPos = zzCurrentPosL;
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
boolean eof = zzRefill();
|
||||
// get translated positions and possibly new buffer
|
||||
zzCurrentPosL = zzCurrentPos;
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzBufferL = zzBuffer;
|
||||
zzEndReadL = zzEndRead;
|
||||
if (eof) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
}
|
||||
}
|
||||
int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
|
||||
if (zzNext == -1)
|
||||
break zzForAction;
|
||||
zzState = zzNext;
|
||||
int zzAttributes = zzAttrL[zzState];
|
||||
if ((zzAttributes & 1) == 1) {
|
||||
zzAction = zzState;
|
||||
zzMarkedPosL = zzCurrentPosL;
|
||||
if ((zzAttributes & 8) == 8)
|
||||
break zzForAction;
|
||||
}
|
||||
}
|
||||
}
|
||||
// store back cached position
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||
case 5: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 20:
|
||||
break;
|
||||
case 10: {
|
||||
addToken(Token.LITERAL_CHAR);
|
||||
}
|
||||
case 21:
|
||||
break;
|
||||
case 8: {
|
||||
addToken(Token.WHITESPACE);
|
||||
}
|
||||
case 22:
|
||||
break;
|
||||
case 12: {
|
||||
addToken(Token.LITERAL_NUMBER_FLOAT);
|
||||
}
|
||||
case 23:
|
||||
break;
|
||||
case 13: {
|
||||
addToken(Token.RESERVED_WORD);
|
||||
}
|
||||
case 24:
|
||||
break;
|
||||
case 9: {
|
||||
addToken(Token.SEPARATOR);
|
||||
}
|
||||
case 25:
|
||||
break;
|
||||
case 15: {
|
||||
yybegin(LONG_STRING_1);
|
||||
addToken(Token.LITERAL_CHAR);
|
||||
}
|
||||
case 26:
|
||||
break;
|
||||
case 2: {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
case 27:
|
||||
break;
|
||||
case 14: {
|
||||
addToken(Token.FUNCTION);
|
||||
}
|
||||
case 28:
|
||||
break;
|
||||
case 1: {
|
||||
addToken(Token.ERROR_IDENTIFIER);
|
||||
}
|
||||
case 29:
|
||||
break;
|
||||
case 17: {
|
||||
addToken(Token.DATA_TYPE);
|
||||
}
|
||||
case 30:
|
||||
break;
|
||||
case 4: {
|
||||
addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
}
|
||||
case 31:
|
||||
break;
|
||||
case 7: {
|
||||
addToken(Token.COMMENT_EOL);
|
||||
}
|
||||
case 32:
|
||||
break;
|
||||
case 11: {
|
||||
addToken(Token.ERROR_NUMBER_FORMAT);
|
||||
}
|
||||
case 33:
|
||||
break;
|
||||
case 3: {
|
||||
addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
|
||||
}
|
||||
case 34:
|
||||
break;
|
||||
case 6: {
|
||||
addToken(Token.OPERATOR);
|
||||
}
|
||||
case 35:
|
||||
break;
|
||||
case 19: {
|
||||
yybegin(YYINITIAL);
|
||||
addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
}
|
||||
case 36:
|
||||
break;
|
||||
case 16: {
|
||||
yybegin(LONG_STRING_2);
|
||||
addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
}
|
||||
case 37:
|
||||
break;
|
||||
case 18: {
|
||||
yybegin(YYINITIAL);
|
||||
addToken(Token.LITERAL_CHAR);
|
||||
}
|
||||
case 38:
|
||||
break;
|
||||
default:
|
||||
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
|
||||
zzAtEOF = true;
|
||||
switch (zzLexicalState) {
|
||||
case YYINITIAL: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 266:
|
||||
break;
|
||||
case LONG_STRING_2: {
|
||||
if (firstToken == null) {
|
||||
addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
}
|
||||
return firstToken;
|
||||
}
|
||||
case 267:
|
||||
break;
|
||||
case LONG_STRING_1: {
|
||||
if (firstToken == null) {
|
||||
addToken(Token.LITERAL_CHAR);
|
||||
}
|
||||
return firstToken;
|
||||
}
|
||||
case 268:
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,760 +0,0 @@
|
||||
/*
|
||||
* 09/11/2008
|
||||
*
|
||||
* RubyTokenMaker.java - Scanner for Ruby
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for Ruby.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>RubyTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class RubyTokenMaker
|
||||
%extends AbstractJFlexTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
/**
|
||||
* Token type specific to RubyTokenMaker; this signals that we are inside
|
||||
* an unquoted/double quoted/backtick EOF heredoc.
|
||||
*/
|
||||
public static final int INTERNAL_HEREDOC_EOF_UNQUOTED = -1;
|
||||
|
||||
/**
|
||||
* Token type specific to RubyTokenMaker; this signals that we are inside
|
||||
* an single quoted EOF heredoc.
|
||||
*/
|
||||
public static final int INTERNAL_HEREDOC_EOF_SINGLE_QUOTED = -2;
|
||||
|
||||
/**
|
||||
* Token type specific to RubyTokenMaker; this signals that we are inside
|
||||
* an double quoted EOF heredoc.
|
||||
*/
|
||||
public static final int INTERNAL_HEREDOC_EOF_DOUBLE_QUOTED = -3;
|
||||
|
||||
/**
|
||||
* Token type specific to RubyTokenMaker; this signals that we are inside
|
||||
* an unquoted/double quoted/backtick EOT heredoc.
|
||||
*/
|
||||
public static final int INTERNAL_HEREDOC_EOT_UNQUOTED = -4;
|
||||
|
||||
/**
|
||||
* Token type specific to RubyTokenMaker; this signals that we are inside
|
||||
* an single quoted EOT heredoc.
|
||||
*/
|
||||
public static final int INTERNAL_HEREDOC_EOT_SINGLE_QUOTED = -5;
|
||||
|
||||
/**
|
||||
* Token type specific to RubyTokenMaker; this signals that we are inside
|
||||
* an double quoted EOT heredoc.
|
||||
*/
|
||||
public static final int INTERNAL_HEREDOC_EOT_DOUBLE_QUOTED = -6;
|
||||
|
||||
/**
|
||||
* Token type specific to RubyTokenMaker; this signals that we are inside
|
||||
* a %Q!...! style double quoted string.
|
||||
*/
|
||||
public static final int INTERNAL_STRING_Q_BANG = -7;
|
||||
|
||||
/**
|
||||
* Token type specific to RubyTokenMaker; this signals that we are inside
|
||||
* a %Q{...} style double quoted string.
|
||||
*/
|
||||
public static final int INTERNAL_STRING_Q_CURLY_BRACE = -8;
|
||||
|
||||
/**
|
||||
* Token type specific to RubyTokenMaker; this signals that we are inside
|
||||
* a %Q<...> style double quoted string.
|
||||
*/
|
||||
public static final int INTERNAL_STRING_Q_LT = -9;
|
||||
|
||||
|
||||
/**
|
||||
* Token type specific to RubyTokenMaker; this signals that we are inside
|
||||
* a %Q(...) style double quoted string.
|
||||
*/
|
||||
public static final int INTERNAL_STRING_Q_PAREN = -10;
|
||||
|
||||
|
||||
/**
|
||||
* Token type specific to RubyTokenMaker; this signals that we are inside
|
||||
* a %Q/.../ style double quoted string.
|
||||
*/
|
||||
public static final int INTERNAL_STRING_Q_SLASH = -11;
|
||||
|
||||
/**
|
||||
* Token type specific to RubyTokenMaker; this signals that we are inside
|
||||
* a %Q[...] style double quoted string.
|
||||
*/
|
||||
public static final int INTERNAL_STRING_Q_SQUARE_BRACKET = -12;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public RubyTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens as an
|
||||
* "end token;" that is, at <code>zzMarkedPos</code>.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addEndToken(int tokenType) {
|
||||
addToken(zzMarkedPos,zzMarkedPos, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "#", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns whether tokens of the specified type should have "mark
|
||||
* occurrences" enabled for the current programming language.
|
||||
*
|
||||
* @param type The token type.
|
||||
* @return Whether tokens of this type should have "mark occurrences"
|
||||
* enabled.
|
||||
*/
|
||||
public boolean getMarkOccurrencesOfTokenType(int type) {
|
||||
return type==Token.IDENTIFIER || type==Token.VARIABLE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.COMMENT_DOCUMENTATION:
|
||||
state = DOCCOMMENT;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = STRING;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.LITERAL_CHAR:
|
||||
state = CHAR_LITERAL;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.LITERAL_BACKQUOTE:
|
||||
state = BACKTICKS;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_HEREDOC_EOF_UNQUOTED:
|
||||
state = HEREDOC_EOF_UNQUOTED;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_HEREDOC_EOF_SINGLE_QUOTED:
|
||||
state = HEREDOC_EOF_SINGLE_QUOTED;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_HEREDOC_EOF_DOUBLE_QUOTED:
|
||||
state = HEREDOC_EOF_DOUBLE_QUOTED;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_HEREDOC_EOT_UNQUOTED:
|
||||
state = HEREDOC_EOT_UNQUOTED;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_HEREDOC_EOT_SINGLE_QUOTED:
|
||||
state = HEREDOC_EOT_SINGLE_QUOTED;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_HEREDOC_EOT_DOUBLE_QUOTED:
|
||||
state = HEREDOC_EOT_DOUBLE_QUOTED;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_STRING_Q_BANG:
|
||||
state = STRING_Q_BANG;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_STRING_Q_CURLY_BRACE:
|
||||
state = STRING_Q_CURLY_BRACE;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_STRING_Q_LT:
|
||||
state = STRING_Q_LT;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_STRING_Q_PAREN:
|
||||
state = STRING_Q_PAREN;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_STRING_Q_SLASH:
|
||||
state = STRING_Q_SLASH;
|
||||
start = text.offset;
|
||||
break;
|
||||
case INTERNAL_STRING_Q_SQUARE_BRACKET:
|
||||
state = STRING_Q_SQUARE_BRACKET;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Letter = [A-Za-z]
|
||||
NonzeroDigit = [1-9]
|
||||
Digit = ("0"|{NonzeroDigit})
|
||||
BinaryDigit = ([01])
|
||||
HexDigit = ({Digit}|[A-Fa-f])
|
||||
OctalDigit = ([0-7])
|
||||
NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\'\`]|"#"|"\\")
|
||||
|
||||
IdentifierStart = ({Letter}|"_")
|
||||
IdentifierPart = ({IdentifierStart}|{Digit})
|
||||
BooleanLiteral = ("true"|"false")
|
||||
|
||||
LineTerminator = (\n)
|
||||
WhiteSpace = ([ \t\f])
|
||||
|
||||
LineCommentBegin = "#"
|
||||
DocCommentBegin = "=begin"
|
||||
DocCommentEnd = "=end"
|
||||
|
||||
DigitOrUnderscore = ({Digit}|[_])
|
||||
BinaryIntLiteral = ("0b"{BinaryDigit}([01_]*{BinaryDigit})?)
|
||||
OctalLiteral = ("0"([0-7_]*{OctalDigit})?)
|
||||
DecimalLiteral1 = ("0d"{Digit}({DigitOrUnderscore}*{Digit})?)
|
||||
DecimalLiteral2 = ({NonzeroDigit}({DigitOrUnderscore}*{Digit})?)
|
||||
DecimalLiteral = ({BinaryIntLiteral}|{OctalLiteral}|{DecimalLiteral1}|{DecimalLiteral2})
|
||||
HexLiteral = ("0x"{HexDigit}([0-9a-zA-Z_]*{HexDigit})?)
|
||||
FloatLiteral = ({NonzeroDigit}({DigitOrUnderscore}*{Digit})?[Ee][+-]?({Digit}({DigitOrUnderscore}*{Digit})?)?)
|
||||
|
||||
Separator = ([\(\)\{\}])
|
||||
Operator1 = ("::"|"."|"["|"]"|"-"|"+"|"!"|"~"|"*"|"/"|"%"|"<<"|">>"|"&"|"|"|"^")
|
||||
Operator2 = (">"|">="|"<"|"<="|"<=>"|"=="|"==="|"!="|"=~"|"!~"|"&&"|"||")
|
||||
Operator3 = (".."|"..."|"="|"+="|"-="|"*="|"/="|"%=")
|
||||
Operator = ({Operator1}|{Operator2}|{Operator3})
|
||||
|
||||
Identifier = ({IdentifierStart}{IdentifierPart}*)
|
||||
Symbol = ([:]{Identifier})
|
||||
ErrorIdentifier = ({NonSeparator}+)
|
||||
|
||||
PreDefinedVariable = ("$"([!@&`\'+0-9~=/\,;.<>_*$?:\"]|"DEBUG"|"FILENAME"|"LOAD_PATH"|"stderr"|"stdin"|"stdout"|"VERBOSE"|([\-][0adFiIlpwv])))
|
||||
Variable = ({PreDefinedVariable}|([@][@]?|[$]){Identifier})
|
||||
|
||||
%state STRING
|
||||
%state STRING_Q_BANG
|
||||
%state STRING_Q_CURLY_BRACE
|
||||
%state STRING_Q_PAREN
|
||||
%state STRING_Q_SLASH
|
||||
%state STRING_Q_SQUARE_BRACKET
|
||||
%state STRING_Q_LT
|
||||
%state CHAR_LITERAL
|
||||
%state BACKTICKS
|
||||
%state HEREDOC_EOF_UNQUOTED
|
||||
%state HEREDOC_EOF_SINGLE_QUOTED
|
||||
%state HEREDOC_EOF_DOUBLE_QUOTED
|
||||
%state HEREDOC_EOT_UNQUOTED
|
||||
%state HEREDOC_EOT_SINGLE_QUOTED
|
||||
%state HEREDOC_EOT_DOUBLE_QUOTED
|
||||
%state DOCCOMMENT
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
/* Keywords */
|
||||
"alias" |
|
||||
"BEGIN" |
|
||||
"begin" |
|
||||
"break" |
|
||||
"case" |
|
||||
"class" |
|
||||
"def" |
|
||||
"defined" |
|
||||
"do" |
|
||||
"else" |
|
||||
"elsif" |
|
||||
"END" |
|
||||
"end" |
|
||||
"ensure" |
|
||||
"for" |
|
||||
"if" |
|
||||
"in" |
|
||||
"module" |
|
||||
"next" |
|
||||
"nil" |
|
||||
"redo" |
|
||||
"rescue" |
|
||||
"retry" |
|
||||
"return" |
|
||||
"self" |
|
||||
"super" |
|
||||
"then" |
|
||||
"undef" |
|
||||
"unless" |
|
||||
"until" |
|
||||
"when" |
|
||||
"while" |
|
||||
"yield" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
"Array" |
|
||||
"Float" |
|
||||
"Integer" |
|
||||
"String" |
|
||||
"at_exit" |
|
||||
"autoload" |
|
||||
"binding" |
|
||||
"caller" |
|
||||
"catch" |
|
||||
"chop" |
|
||||
"chop!" |
|
||||
"chomp" |
|
||||
"chomp!" |
|
||||
"eval" |
|
||||
"exec" |
|
||||
"exit" |
|
||||
"exit!" |
|
||||
"fail" |
|
||||
"fork" |
|
||||
"format" |
|
||||
"gets" |
|
||||
"global_variables" |
|
||||
"gsub" |
|
||||
"gsub!" |
|
||||
"iterator?" |
|
||||
"lambda" |
|
||||
"load" |
|
||||
"local_variables" |
|
||||
"loop" |
|
||||
"open" |
|
||||
"p" |
|
||||
"print" |
|
||||
"printf" |
|
||||
"proc" |
|
||||
"putc" |
|
||||
"puts" |
|
||||
"raise" |
|
||||
"rand" |
|
||||
"readline" |
|
||||
"readlines" |
|
||||
"require" |
|
||||
"select" |
|
||||
"sleep" |
|
||||
"split" |
|
||||
"sprintf" |
|
||||
"srand" |
|
||||
"sub" |
|
||||
"sub!" |
|
||||
"syscall" |
|
||||
"system" |
|
||||
"test" |
|
||||
"trace_var" |
|
||||
"trap" |
|
||||
"untrace_var" { addToken(Token.FUNCTION); }
|
||||
|
||||
"and" |
|
||||
"or" |
|
||||
"not" { addToken(Token.OPERATOR); }
|
||||
|
||||
{BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
|
||||
|
||||
{Variable} { addToken(Token.VARIABLE); }
|
||||
{Symbol} { addToken(Token.PREPROCESSOR); }
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
{WhiteSpace}+ { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* String/Character literals. */
|
||||
\" { start = zzMarkedPos-1; yybegin(STRING); }
|
||||
\' { start = zzMarkedPos-1; yybegin(CHAR_LITERAL); }
|
||||
[\%][QqWwx]?[\(] { start = zzMarkedPos-yylength(); yybegin(STRING_Q_PAREN); }
|
||||
[\%][QqWwx]?[\{] { start = zzMarkedPos-yylength(); yybegin(STRING_Q_CURLY_BRACE); }
|
||||
[\%][QqWwx]?[\[] { start = zzMarkedPos-yylength(); yybegin(STRING_Q_SQUARE_BRACKET); }
|
||||
[\%][QqWwx]?[\<] { start = zzMarkedPos-yylength(); yybegin(STRING_Q_LT); }
|
||||
[\%][QqWwx]?[\!] { start = zzMarkedPos-yylength(); yybegin(STRING_Q_BANG); }
|
||||
[\%][QqWwx]?[\/] { start = zzMarkedPos-yylength(); yybegin(STRING_Q_SLASH); }
|
||||
\` { start = zzMarkedPos-1; yybegin(BACKTICKS); }
|
||||
|
||||
/* Comment literals. */
|
||||
{LineCommentBegin}.* { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
{DocCommentBegin} { start = zzMarkedPos-6; yybegin(DOCCOMMENT); }
|
||||
|
||||
/* "Here-document" syntax. This is only implemented for the common */
|
||||
/* cases. */
|
||||
"<<EOF" { start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
|
||||
"<<" {WhiteSpace}* \""EOF"\" { start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
|
||||
"<<" {WhiteSpace}* \'"EOF"\' { start = zzStartRead; yybegin(HEREDOC_EOF_SINGLE_QUOTED); }
|
||||
"<<" {WhiteSpace}* \`"EOF"\` { start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
|
||||
"<<EOT" { start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
|
||||
"<<" {WhiteSpace}* \""EOT"\" { start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
|
||||
"<<" {WhiteSpace}* \'"EOT"\' { start = zzStartRead; yybegin(HEREDOC_EOT_SINGLE_QUOTED); }
|
||||
"<<" {WhiteSpace}* \`"EOT"\` { start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
|
||||
|
||||
/* Separators and operators. */
|
||||
{Separator} { addToken(Token.SEPARATOR); }
|
||||
{Operator} { addToken(Token.OPERATOR); }
|
||||
|
||||
/* Numbers */
|
||||
{DecimalLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
|
||||
{FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
|
||||
{ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters. */
|
||||
. { addToken(Token.IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
|
||||
<STRING> {
|
||||
[^\n\\\"]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
\" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<STRING_Q_BANG> {
|
||||
[^\n\\\!]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_BANG); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
\! { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_BANG); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<STRING_Q_CURLY_BRACE> {
|
||||
[^\n\\\}]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_CURLY_BRACE); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
\} { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_CURLY_BRACE); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<STRING_Q_LT> {
|
||||
[^\n\\\>]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_LT); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
\> { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_LT); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<STRING_Q_PAREN> {
|
||||
[^\n\\\)]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_PAREN); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
\) { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_PAREN); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<STRING_Q_SLASH> {
|
||||
[^\n\\\/]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SLASH); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
\/ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SLASH); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<STRING_Q_SQUARE_BRACKET> {
|
||||
[^\n\\\]]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SQUARE_BRACKET); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
\] { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SQUARE_BRACKET); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<CHAR_LITERAL> {
|
||||
[^\n\\\']+ {}
|
||||
\\.? { /* Skip escaped single quotes only, but this should still work. */ }
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
|
||||
\' { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<BACKTICKS> {
|
||||
[^\n\\\`]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
\` { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<HEREDOC_EOF_UNQUOTED> {
|
||||
/* NOTE: The closing "EOF" is supposed to be on a line by itself - */
|
||||
/* no surrounding whitespace or other chars. However, the way */
|
||||
/* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
|
||||
/* work. Fortunately we don't need the start- and end-line anchors */
|
||||
/* since the production after "EOF" will match any line containing */
|
||||
/* EOF and any other chars. */
|
||||
/* NOTE2: This case is used for unquoted <<EOF, double quoted */
|
||||
/* <<"EOF" and backticks <<`EOF`, since they all follow the same */
|
||||
/* syntactic rules. */
|
||||
"EOF" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
|
||||
[^\n\\]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<HEREDOC_EOF_SINGLE_QUOTED> {
|
||||
/* NOTE: The closing "EOF" is supposed to be on a line by itself - */
|
||||
/* no surrounding whitespace or other chars. However, the way */
|
||||
/* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
|
||||
/* work. Fortunately we don't need the start- and end-line anchors */
|
||||
/* since the production after "EOF" will match any line containing */
|
||||
/* EOF and any other chars. */
|
||||
"EOF" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
|
||||
[^\n\\]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<HEREDOC_EOF_DOUBLE_QUOTED> {
|
||||
/* NOTE: The closing "EOF" is supposed to be on a line by itself - */
|
||||
/* no surrounding whitespace or other chars. However, the way */
|
||||
/* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
|
||||
/* work. Fortunately we don't need the start- and end-line anchors */
|
||||
/* since the production after "EOF" will match any line containing */
|
||||
/* EOF and any other chars. */
|
||||
"EOF" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
|
||||
[^\n\\]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<HEREDOC_EOT_UNQUOTED> {
|
||||
/* NOTE: The closing "EOT" is supposed to be on a line by itself - */
|
||||
/* no surrounding whitespace or other chars. However, the way */
|
||||
/* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
|
||||
/* work. Fortunately we don't need the start- and end-line anchors */
|
||||
/* since the production after "EOT" will match any line containing */
|
||||
/* EOF and any other chars. */
|
||||
/* NOTE2: This case is used for unquoted <<EOT, double quoted */
|
||||
/* <<"EOT" and backticks <<`EOT`, since they all follow the same */
|
||||
/* syntactic rules. */
|
||||
"EOT" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
|
||||
[^\n\\]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<HEREDOC_EOT_SINGLE_QUOTED> {
|
||||
/* NOTE: The closing "EOT" is supposed to be on a line by itself - */
|
||||
/* no surrounding whitespace or other chars. However, the way */
|
||||
/* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
|
||||
/* work. Fortunately we don't need the start- and end-line anchors */
|
||||
/* since the production after "EOT" will match any line containing */
|
||||
/* EOT and any other chars. */
|
||||
"EOT" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
|
||||
[^\n\\]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<HEREDOC_EOT_DOUBLE_QUOTED> {
|
||||
/* NOTE: The closing "EOT" is supposed to be on a line by itself - */
|
||||
/* no surrounding whitespace or other chars. However, the way */
|
||||
/* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
|
||||
/* work. Fortunately we don't need the start- and end-line anchors */
|
||||
/* since the production after "EOT" will match any line containing */
|
||||
/* EOT and any other chars. */
|
||||
"EOT" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
|
||||
[^\n\\]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
|
||||
\\.? { /* Skip escaped chars. */ }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
|
||||
}
|
||||
|
||||
|
||||
<DOCCOMMENT> {
|
||||
|
||||
[^\n\=]+ {}
|
||||
{DocCommentEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+3, Token.COMMENT_DOCUMENTATION); }
|
||||
= {}
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken; }
|
||||
<<EOF>> { yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken; }
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,672 +0,0 @@
|
||||
/*
|
||||
* 02/25/2005
|
||||
*
|
||||
* SASTokenMaker.java - Scanner for SAS files.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* This class generates tokens representing a text stream as SAS.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>SASTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class SASTokenMaker
|
||||
%extends AbstractJFlexTokenMaker
|
||||
%unicode
|
||||
%ignorecase
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public SASTokenMaker() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "*", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns whether tokens of the specified type should have "mark
|
||||
* occurrences" enabled for the current programming language.
|
||||
*
|
||||
* @param type The token type.
|
||||
* @return Whether tokens of this type should have "mark occurrences"
|
||||
* enabled.
|
||||
*/
|
||||
public boolean getMarkOccurrencesOfTokenType(int type) {
|
||||
return type==Token.IDENTIFIER || type==Token.VARIABLE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = STRING;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.LITERAL_CHAR:
|
||||
state = CHAR;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.COMMENT_MULTILINE:
|
||||
state = MLC;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
LineTerminator = ([\n])
|
||||
Letter = ([A-Za-z_])
|
||||
Digit = ([0-9])
|
||||
Whitespace = ([ \t]+)
|
||||
Semicolon = ([;])
|
||||
|
||||
Identifier = (({Letter}|{Digit})+)
|
||||
MacroVariable = (&{Identifier})
|
||||
|
||||
Operators1 = ("+"|"-"|"*"|"/"|"^"|"|")
|
||||
Operators2 = (([\^\~]?=)|(">"[=]?)|("<"[=]?))
|
||||
Operators3 = ("eq"|"ne"|"gt"|"lt"|"ge"|"le"|"in")
|
||||
Operator = ({Operators1}|{Operators2}|{Operators3})
|
||||
Separator = ([\(\)])
|
||||
|
||||
StringBoundary = (\")
|
||||
CharBoundary = (\')
|
||||
|
||||
LineCommentBegin = ("*")
|
||||
MLCBegin = ("/*")
|
||||
MLCEnd = ("*/")
|
||||
|
||||
%state STRING
|
||||
%state CHAR
|
||||
%state MLC
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
/* Keywords */
|
||||
"_all_" |
|
||||
"_character_" |
|
||||
"_data_" |
|
||||
"_infile_" |
|
||||
"_last_" |
|
||||
"_null_" |
|
||||
"_numeric_" |
|
||||
"_page_" |
|
||||
"_temporary_" |
|
||||
"abend" |
|
||||
"abort" |
|
||||
"all" |
|
||||
"alter" |
|
||||
"and" |
|
||||
"array" |
|
||||
"as" |
|
||||
"ascending" |
|
||||
"attrib" |
|
||||
"axis" |
|
||||
"bell" |
|
||||
"blank" |
|
||||
"border" |
|
||||
"bounds" |
|
||||
"by" |
|
||||
"call" |
|
||||
"cancel" |
|
||||
"cards" |
|
||||
"cards4" |
|
||||
"choro" |
|
||||
"class" |
|
||||
"classes" |
|
||||
"clear" |
|
||||
"close" |
|
||||
"compute" |
|
||||
"contrast" |
|
||||
"coord" |
|
||||
"coordinates" |
|
||||
"cov" |
|
||||
"create" |
|
||||
"data" |
|
||||
"datalines" |
|
||||
"datalines4" |
|
||||
"delete" |
|
||||
"descending" |
|
||||
"describe" |
|
||||
"discrete" |
|
||||
"disk" |
|
||||
"display" |
|
||||
"dm" |
|
||||
"do" |
|
||||
"drop" |
|
||||
"dummy" |
|
||||
"else" |
|
||||
"end" |
|
||||
"endrsubmit" |
|
||||
"endsas" |
|
||||
"error" |
|
||||
"except" |
|
||||
"expandtabs" |
|
||||
"factors" |
|
||||
"file" |
|
||||
"filename" |
|
||||
"flowover" |
|
||||
"footnote" |
|
||||
"frame" |
|
||||
"freq" |
|
||||
"from" |
|
||||
"go" |
|
||||
"goption" |
|
||||
"goptions" |
|
||||
"goto" |
|
||||
"grid" |
|
||||
"group" |
|
||||
"groupby" |
|
||||
"groupformat" |
|
||||
"having" |
|
||||
"haxis" |
|
||||
"hbar" |
|
||||
"heading" |
|
||||
"high" |
|
||||
"html" |
|
||||
"id" |
|
||||
"if" |
|
||||
"infile" |
|
||||
"informat" |
|
||||
"inner" |
|
||||
"input" |
|
||||
"insert" |
|
||||
"intersect" |
|
||||
"keep" |
|
||||
"keylabel" |
|
||||
"label" |
|
||||
"lable" |
|
||||
"legend" |
|
||||
"length" |
|
||||
"libname" |
|
||||
"lineqs" |
|
||||
"link" |
|
||||
"list" |
|
||||
"listing" |
|
||||
"log" |
|
||||
"lostcard" |
|
||||
"low" |
|
||||
"mark" |
|
||||
"matings" |
|
||||
"mean" |
|
||||
"merge" |
|
||||
"missing" |
|
||||
"missover" |
|
||||
"mod" |
|
||||
"model" |
|
||||
"modify" |
|
||||
"n" |
|
||||
"nocell" |
|
||||
"nocharacters" |
|
||||
"nodupkey" |
|
||||
"noexpandtabs" |
|
||||
"noframe" |
|
||||
"noheading" |
|
||||
"noinput" |
|
||||
"nolegend" |
|
||||
"nopad" |
|
||||
"noprint" |
|
||||
"nosharebuffers" |
|
||||
"not" |
|
||||
"note" |
|
||||
"notitle" |
|
||||
"notitles" |
|
||||
"notsorted" |
|
||||
"ods" |
|
||||
"old" |
|
||||
"option" |
|
||||
"or" |
|
||||
"order" |
|
||||
"orderby" |
|
||||
"other" |
|
||||
"otherwise" |
|
||||
"outer" |
|
||||
"output" |
|
||||
"over" |
|
||||
"overlay" |
|
||||
"overprint" |
|
||||
"pad" |
|
||||
"pageby" |
|
||||
"pagesize" |
|
||||
"parmcards" |
|
||||
"parmcards4" |
|
||||
"parms" |
|
||||
"pattern" |
|
||||
"pct" |
|
||||
"pctn" |
|
||||
"pctsum" |
|
||||
"picture" |
|
||||
"pie" |
|
||||
"pie3d" |
|
||||
"plotter" |
|
||||
"predict" |
|
||||
"prefix" |
|
||||
"printer" |
|
||||
"proc" |
|
||||
"ps" |
|
||||
"put" |
|
||||
"quit" |
|
||||
"random" |
|
||||
"range" |
|
||||
"remove" |
|
||||
"rename" |
|
||||
"response" |
|
||||
"replace" |
|
||||
"reset" |
|
||||
"retain" |
|
||||
"return" |
|
||||
"rsubmit" |
|
||||
"run" |
|
||||
"s2" |
|
||||
"select" |
|
||||
"set" |
|
||||
"sharebuffers" |
|
||||
"signoff" |
|
||||
"signon" |
|
||||
"sim" |
|
||||
"skip" |
|
||||
"source2" |
|
||||
"startsas" |
|
||||
"std" |
|
||||
"stop" |
|
||||
"stopover" |
|
||||
"strata" |
|
||||
"sum" |
|
||||
"sumby" |
|
||||
"supvar" |
|
||||
"symbol" |
|
||||
"table" |
|
||||
"tables" |
|
||||
"tape" |
|
||||
"terminal" |
|
||||
"test" |
|
||||
"then" |
|
||||
"time" |
|
||||
"title" |
|
||||
"to" |
|
||||
"transform" |
|
||||
"treatments" |
|
||||
"truncover" |
|
||||
"unbuf" |
|
||||
"unbuffered" |
|
||||
"union" |
|
||||
"until" |
|
||||
"update" |
|
||||
"validate" |
|
||||
"value" |
|
||||
"var" |
|
||||
"variables" |
|
||||
"vaxis" |
|
||||
"vbar" |
|
||||
"weight" |
|
||||
"when" |
|
||||
"where" |
|
||||
"while" |
|
||||
"with" |
|
||||
"window" |
|
||||
"x" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
/* Base SAS procs. */
|
||||
"append" |
|
||||
"calendar" |
|
||||
"catalog" |
|
||||
"chart" |
|
||||
"cimport" |
|
||||
"compare" |
|
||||
"contents" |
|
||||
"copy" |
|
||||
"cpm" |
|
||||
"cport" |
|
||||
"datasets" |
|
||||
"display" |
|
||||
"explode" |
|
||||
"export" |
|
||||
"fontreg" |
|
||||
"format" |
|
||||
"forms" |
|
||||
"fslist" |
|
||||
"import" |
|
||||
"means" |
|
||||
"migrate" |
|
||||
"options" |
|
||||
"optload" |
|
||||
"optsave" |
|
||||
"plot" |
|
||||
"pmenu" |
|
||||
"print" |
|
||||
"printto" |
|
||||
"proto" |
|
||||
"prtdef" |
|
||||
"prtexp" |
|
||||
"pwencode" |
|
||||
"rank" |
|
||||
"registry" |
|
||||
"report" |
|
||||
"sort" |
|
||||
"sql" |
|
||||
"standard" |
|
||||
"summary" |
|
||||
"tabulate" |
|
||||
"template" |
|
||||
"timeplot" |
|
||||
"transpose" { addToken(Token.DATA_TYPE); }
|
||||
|
||||
/* SAS/STAT procs. */
|
||||
"corr" |
|
||||
"freq" |
|
||||
"univariate" { addToken(Token.DATA_TYPE); }
|
||||
|
||||
/* Macros. */
|
||||
"%abort" |
|
||||
"%bquote" |
|
||||
"%by" |
|
||||
"%cms" |
|
||||
"%copy" |
|
||||
"%display" |
|
||||
"%do" |
|
||||
"%else" |
|
||||
"%end" |
|
||||
"%eval" |
|
||||
"%global" |
|
||||
"%go" |
|
||||
"%goto" |
|
||||
"%if" |
|
||||
"%inc" |
|
||||
"%include" |
|
||||
"%index" |
|
||||
"%input" |
|
||||
"%keydef" |
|
||||
"%length" |
|
||||
"%let" |
|
||||
"%local" |
|
||||
"%macro" |
|
||||
"%mend" |
|
||||
"%nrbquote" |
|
||||
"%nrquote" |
|
||||
"%nrstr" |
|
||||
"%put" |
|
||||
"%qscan" |
|
||||
"%qsubstr" |
|
||||
"%qsysfunc" |
|
||||
"%quote" |
|
||||
"%qupcase" |
|
||||
"%scan" |
|
||||
"%str" |
|
||||
"%substr" |
|
||||
"%superq" |
|
||||
"%syscall" |
|
||||
"%sysevalf" |
|
||||
"%sysexec" |
|
||||
"%sysfunc" |
|
||||
"%sysget" |
|
||||
"%sysprod" |
|
||||
"%sysrput" |
|
||||
"%then" |
|
||||
"%to" |
|
||||
"%tso" |
|
||||
"%unquote" |
|
||||
"%until" |
|
||||
"%upcase" |
|
||||
"%while" |
|
||||
"%window" { addToken(Token.FUNCTION); }
|
||||
|
||||
}
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
|
||||
/* Comments. */
|
||||
/* Do comments before operators as "*" can signify a line comment as */
|
||||
/* well as an operator. */
|
||||
^[ \t]*{LineCommentBegin} {
|
||||
// We must do this because of how we
|
||||
// abuse JFlex; since we return an entire
|
||||
// list of tokens at once instead of a
|
||||
// single token at a time, the "^" regex
|
||||
// character doesn't really work, so we must
|
||||
// check that we're at the beginning of a
|
||||
// line ourselves.
|
||||
start = zzStartRead;
|
||||
// Might not be any whitespace.
|
||||
if (yylength()>1) {
|
||||
addToken(zzStartRead,zzMarkedPos-2, Token.WHITESPACE);
|
||||
zzStartRead = zzMarkedPos-1;
|
||||
}
|
||||
// Remember: zzStartRead may now be updated,
|
||||
// so we must check against 'start'.
|
||||
if (start==s.offset) {
|
||||
addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
else {
|
||||
addToken(zzStartRead,zzStartRead, Token.OPERATOR);
|
||||
}
|
||||
}
|
||||
{MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
|
||||
|
||||
/* Do operators before identifiers since some of them are words. */
|
||||
{Operator} { addToken(Token.OPERATOR); }
|
||||
{Separator} { addToken(Token.SEPARATOR); }
|
||||
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
{MacroVariable} { addToken(Token.VARIABLE); }
|
||||
{Semicolon} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
{Whitespace} { addToken(Token.WHITESPACE); }
|
||||
|
||||
{StringBoundary} { start = zzMarkedPos-1; yybegin(STRING); }
|
||||
{CharBoundary} { start = zzMarkedPos-1; yybegin(CHAR); }
|
||||
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters and flag them as OK; */
|
||||
/* This will include "." from statements like "from lib.dataset". */
|
||||
. { addToken(Token.IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
<STRING> {
|
||||
|
||||
[^\n\"]+ {}
|
||||
{LineTerminator} { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
/* {StringBoundary}{StringBoundary} {} */
|
||||
{StringBoundary} { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
<CHAR> {
|
||||
|
||||
[^\n\']+ {}
|
||||
{LineTerminator} { yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
|
||||
/* {CharBoundary}{CharBoundary} {} */
|
||||
{CharBoundary} { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
<MLC> {
|
||||
|
||||
[^\n\*]+ {}
|
||||
{LineTerminator} { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
{MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
|
||||
\* {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,473 +0,0 @@
|
||||
/*
|
||||
* 02/15/2005
|
||||
*
|
||||
* SQLTokenMaker.java - Scanner for SQL.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* This class generates tokens representing a text stream as SQL.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>SQLTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class SQLTokenMaker
|
||||
%extends AbstractJFlexTokenMaker
|
||||
%unicode
|
||||
%ignorecase
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public SQLTokenMaker() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Overridden to return <code>true</code> so paren matching occurs for
|
||||
* SQL.
|
||||
*
|
||||
* @return <code>true</code> always.
|
||||
*/
|
||||
@Override
|
||||
public boolean getCurlyBracesDenoteCodeBlocks(int languageIndex) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "--", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = STRING;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.LITERAL_CHAR:
|
||||
state = CHAR;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.COMMENT_MULTILINE:
|
||||
state = MLC;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
LineTerminator = ([\n])
|
||||
Letter = ([A-Za-z])
|
||||
Digit = ([0-9])
|
||||
Whitespace = ([ \t]+)
|
||||
|
||||
IdentifierStart = ({Letter})
|
||||
IdentifierPart = ({IdentifierStart}|{Digit}|[_])
|
||||
Identifier = ({IdentifierStart}{IdentifierPart}*)
|
||||
|
||||
Operator = (">="|"<="|"<>"|">"|"<"|"="|"+"|"-"|"*"|"/")
|
||||
Separator = ([\(\)])
|
||||
|
||||
Parameter = ([:]{Identifier})
|
||||
|
||||
Integer = ({Digit}+)
|
||||
Float = (({Digit}+[.]{Digit}*)|([.]{Digit}*))
|
||||
ApproxNum = (({Digit}+[eE][+-]?{Digit}+)|({Digit}+[.]{Digit}*[eE][+-]?[0-9]+)|([.][0-9]*[eE][+-]?[0-9]+))
|
||||
|
||||
CommentBegin = ("--")
|
||||
Comment = ({CommentBegin}.*)
|
||||
MLCBegin = "/*"
|
||||
MLCEnd = "*/"
|
||||
|
||||
%state STRING
|
||||
%state CHAR
|
||||
%state MLC
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
/* Keywords */
|
||||
"ADD" |
|
||||
"ALL" |
|
||||
"ALTER" |
|
||||
"AND" |
|
||||
"ANY" |
|
||||
"AS" |
|
||||
"ASC" |
|
||||
"AUTOINCREMENT" |
|
||||
"AVA" |
|
||||
"BETWEEN" |
|
||||
"BINARY" |
|
||||
"BIT" |
|
||||
"BOOLEAN" |
|
||||
"BY" |
|
||||
"BYTE" |
|
||||
"CHAR" |
|
||||
"CHARACTER" |
|
||||
"COLUMN" |
|
||||
"CONSTRAINT" |
|
||||
"COUNT" |
|
||||
"COUNTER" |
|
||||
"CREATE" |
|
||||
"CURRENCY" |
|
||||
"DATABASE" |
|
||||
"DATE" |
|
||||
"DATETIME" |
|
||||
"DELETE" |
|
||||
"DESC" |
|
||||
"DISALLOW" |
|
||||
"DISTINCT" |
|
||||
"DISTINCTROW" |
|
||||
"DOUBLE" |
|
||||
"DROP" |
|
||||
"EXISTS" |
|
||||
"FLOAT" |
|
||||
"FLOAT4" |
|
||||
"FLOAT8" |
|
||||
"FOREIGN" |
|
||||
"FROM" |
|
||||
"GENERAL" |
|
||||
"GROUP" |
|
||||
"GUID" |
|
||||
"HAVING" |
|
||||
"INNER" |
|
||||
"INSERT" |
|
||||
"IGNORE" |
|
||||
"IMP" |
|
||||
"IN" |
|
||||
"INDEX" |
|
||||
"INT" |
|
||||
"INTEGER" |
|
||||
"INTEGER1" |
|
||||
"INTEGER2" |
|
||||
"INTEGER4" |
|
||||
"INTO" |
|
||||
"IS" |
|
||||
"JOIN" |
|
||||
"KEY" |
|
||||
"LEFT" |
|
||||
"LEVEL" |
|
||||
"LIKE" |
|
||||
"LOGICAL" |
|
||||
"LONG" |
|
||||
"LONGBINARY" |
|
||||
"LONGTEXT" |
|
||||
"MAX" |
|
||||
"MEMO" |
|
||||
"MIN" |
|
||||
"MOD" |
|
||||
"MONEY" |
|
||||
"NOT" |
|
||||
"NULL" |
|
||||
"NUMBER" |
|
||||
"NUMERIC" |
|
||||
"OLEOBJECT" |
|
||||
"ON" |
|
||||
"OPTION" |
|
||||
"OR" |
|
||||
"ORDER" |
|
||||
"OUTER" |
|
||||
"OWNERACCESS" |
|
||||
"PARAMETERS" |
|
||||
"PASSWORD" |
|
||||
"PERCENT" |
|
||||
"PIVOT" |
|
||||
"PRIMARY" |
|
||||
"REAL" |
|
||||
"REFERENCES" |
|
||||
"RIGHT" |
|
||||
"SELECT" |
|
||||
"SET" |
|
||||
"SHORT" |
|
||||
"SINGLE" |
|
||||
"SMALLINT" |
|
||||
"SOME" |
|
||||
"STDEV" |
|
||||
"STDEVP" |
|
||||
"STRING" |
|
||||
"SUM" |
|
||||
"TABLE" |
|
||||
"TABLEID" |
|
||||
"TEXT" |
|
||||
"TIME" |
|
||||
"TIMESTAMP" |
|
||||
"TOP" |
|
||||
"TRANSFORM" |
|
||||
"TYPE" |
|
||||
"UNION" |
|
||||
"UNIQUE" |
|
||||
"UPDATE" |
|
||||
"USER" |
|
||||
"VALUE" |
|
||||
"VALUES" |
|
||||
"VAR" |
|
||||
"VARBINARY" |
|
||||
"VARCHAR" |
|
||||
"VARP" |
|
||||
"WHERE" |
|
||||
"WITH" |
|
||||
"YESNO" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
/* SQL99 aggregate functions */
|
||||
"AVG" |
|
||||
"COUNT" |
|
||||
"MIN" |
|
||||
"MAX" |
|
||||
"SUM" { addToken(Token.FUNCTION); }
|
||||
|
||||
/* SQL99 built-in scalar functions */
|
||||
"CURRENT_DATE" |
|
||||
"CURRENT_TIME" |
|
||||
"CURRENT_TIMESTAMP" |
|
||||
"CURRENT_USER" |
|
||||
"SESSION_USER" |
|
||||
"SYSTEM_USER" { addToken(Token.FUNCTION); }
|
||||
|
||||
/* SQL99 numeric scalar functions */
|
||||
"BIT_LENGTH" |
|
||||
"CHAR_LENGTH" |
|
||||
"EXTRACT" |
|
||||
"OCTET_LENGTH" |
|
||||
"POSITION" { addToken(Token.FUNCTION); }
|
||||
|
||||
/* SQL99 string functions */
|
||||
"CONCATENATE" |
|
||||
"CONVERT" |
|
||||
"LOWER" |
|
||||
"SUBSTRING" |
|
||||
"TRANSLATE" |
|
||||
"TRIM" |
|
||||
"UPPER" { addToken(Token.FUNCTION); }
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
";" { addToken(Token.IDENTIFIER); }
|
||||
|
||||
{Parameter} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
{Comment} { addToken(Token.COMMENT_EOL); }
|
||||
{MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
|
||||
|
||||
{Whitespace} { addToken(Token.WHITESPACE); }
|
||||
|
||||
{Operator} { addToken(Token.OPERATOR); }
|
||||
{Separator} { addToken(Token.SEPARATOR); }
|
||||
|
||||
{Integer} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{Float} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
{ApproxNum} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
|
||||
"\"" { start = zzMarkedPos-1; yybegin(STRING); }
|
||||
"\'" { start = zzMarkedPos-1; yybegin(CHAR); }
|
||||
|
||||
"["[^\]]*"]" { addToken(Token.PREPROCESSOR); }
|
||||
"["[^\]]* { addToken(Token.ERROR_IDENTIFIER); addNullToken(); return firstToken; }
|
||||
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters and flag them as OK; */
|
||||
/* I don't know enough about SQL to know what's really invalid. */
|
||||
. { addToken(Token.IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
<STRING> {
|
||||
|
||||
[^\n\"]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
"\"\"" {}
|
||||
"\"" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
<CHAR> {
|
||||
|
||||
[^\n\']+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
|
||||
"\'\'" {}
|
||||
"\'" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
|
||||
|
||||
}
|
||||
|
||||
<MLC> {
|
||||
|
||||
[^\n\*]+ {}
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
{MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
|
||||
\* {}
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
|
||||
}
|
||||
@@ -1,932 +0,0 @@
|
||||
/* The following code was generated by JFlex 1.4.1 on 6/29/14 12:25 AM */
|
||||
/*
|
||||
* 02/15/2005
|
||||
* SQLTokenMaker.java - Scanner for SQL.
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
|
||||
import org.fife.ui.rsyntaxtextarea.Token;
|
||||
import org.fife.ui.rsyntaxtextarea.TokenImpl;
|
||||
|
||||
/**
|
||||
* This class generates tokens representing a text stream as SQL.
|
||||
* <p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost completely
|
||||
* removed to be competitive with the handwritten lexers (subclasses of
|
||||
* <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around). We can
|
||||
* achieve this because RText always scans exactly 1 line of tokens at a time,
|
||||
* and hands the scanner this line as an array of characters (a Segment really).
|
||||
* Since tokens contain pointers to char arrays instead of Strings holding their
|
||||
* contents, there is no need for allocating new memory for Strings.
|
||||
* <p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.
|
||||
* <p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>SQLTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>. You
|
||||
* should hand-delete the second of each definition (the ones generated by the
|
||||
* lexer), as these generated methods modify the input buffer, which we'll never
|
||||
* have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT be
|
||||
* initialized. This is a needless memory allocation for us since we will be
|
||||
* pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would with
|
||||
* any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
public class SQLTokenMaker extends AbstractJFlexTokenMaker {
|
||||
|
||||
/** This character denotes the end of file */
|
||||
public static final int YYEOF = -1;
|
||||
/** lexical states */
|
||||
public static final int STRING = 1;
|
||||
public static final int YYINITIAL = 0;
|
||||
public static final int MLC = 3;
|
||||
public static final int CHAR = 2;
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final String ZZ_CMAP_PACKED = "\11\0\1\4\1\1\25\0\1\4\1\0\1\54\4\0\1\55\2\15"
|
||||
+ "\1\13\1\11\1\0\1\12\1\17\1\14\1\3\1\50\1\50\1\3" + "\1\45\3\3\1\46\1\3\1\16\1\0\1\10\1\7\1\6\2\0"
|
||||
+ "\1\21\1\37\1\31\1\22\1\20\1\44\1\47\1\41\1\34\1\51"
|
||||
+ "\1\52\1\23\1\35\1\26\1\33\1\42\1\53\1\25\1\30\1\24" + "\1\32\1\36\1\40\1\43\1\27\1\2\1\56\1\0\1\57\1\0"
|
||||
+ "\1\5\1\0\1\21\1\37\1\31\1\22\1\20\1\44\1\47\1\41" + "\1\34\1\51\1\52\1\23\1\35\1\26\1\33\1\42\1\53\1\25"
|
||||
+ "\1\30\1\24\1\32\1\36\1\40\1\43\1\27\1\2\uff85\0";
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
|
||||
/**
|
||||
* Translates DFA states to action switch labels.
|
||||
*/
|
||||
private static final int[] ZZ_ACTION = zzUnpackAction();
|
||||
private static final String ZZ_ACTION_PACKED_0 = "\4\0\1\1\1\2\1\1\1\3\1\4\5\5\1\6"
|
||||
+ "\1\1\1\7\27\1\1\10\1\11\1\12\1\13\1\14" + "\1\15\1\13\1\16\1\17\1\13\1\20\1\13\1\0"
|
||||
+ "\1\21\1\22\4\1\1\23\45\1\2\23\4\1\1\23" + "\7\1\1\23\22\1\1\24\1\13\1\25\1\7\1\0"
|
||||
+ "\3\1\1\26\51\1\1\23\4\1\1\23\2\1\1\23" + "\22\1\1\23\4\1\1\23\4\1\1\23\17\1\1\23"
|
||||
+ "\35\1\1\23\5\1\1\23\10\1\1\23\5\1\1\23" + "\11\1\1\23\42\1\1\23\4\1\1\23\16\1\1\26" + "\4\1";
|
||||
|
||||
private static int[] zzUnpackAction() {
|
||||
int[] result = new int[354];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAction(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a state to a row index in the transition table
|
||||
*/
|
||||
private static final int[] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\60\0\140\0\220\0\300\0\300\0\360\0\u0120"
|
||||
+ "\0\u0150\0\u0180\0\300\0\u01b0\0\u01e0\0\u0210\0\300\0\u0240"
|
||||
+ "\0\u0270\0\u02a0\0\u02d0\0\u0300\0\u0330\0\u0360\0\u0390\0\u03c0"
|
||||
+ "\0\u03f0\0\u0420\0\u0450\0\u0480\0\u04b0\0\u04e0\0\u0510\0\u0540"
|
||||
+ "\0\u0570\0\u05a0\0\u05d0\0\u0600\0\u0630\0\u0660\0\u0690\0\u06c0"
|
||||
+ "\0\300\0\300\0\u06f0\0\u0720\0\300\0\u0750\0\u0780\0\300"
|
||||
+ "\0\u07b0\0\u07e0\0\300\0\u0810\0\u0840\0\u0870\0\300\0\u08a0"
|
||||
+ "\0\u08d0\0\u0900\0\u0930\0\u0960\0\u0990\0\u09c0\0\u09f0\0\u0a20"
|
||||
+ "\0\u0a50\0\u0a80\0\u0ab0\0\u0ae0\0\u0b10\0\u0b40\0\u0b70\0\u0ba0"
|
||||
+ "\0\u0bd0\0\u0c00\0\u0c30\0\u0c60\0\u0c90\0\u0cc0\0\u0cf0\0\u0d20"
|
||||
+ "\0\u0d50\0\u0d80\0\u0db0\0\u0de0\0\u0e10\0\u0e40\0\u0e70\0\u0ea0"
|
||||
+ "\0\u0ed0\0\u0f00\0\u0f30\0\u0f60\0\u0f90\0\u0fc0\0\u0ff0\0\u1020"
|
||||
+ "\0\u1050\0\u1080\0\360\0\u10b0\0\u10e0\0\u1110\0\u1140\0\u1170"
|
||||
+ "\0\u11a0\0\u11d0\0\u1200\0\u1230\0\u1260\0\u1290\0\u12c0\0\u12f0"
|
||||
+ "\0\u1320\0\u1350\0\u1380\0\u13b0\0\u13e0\0\u1410\0\u1440\0\u1470"
|
||||
+ "\0\u14a0\0\u14d0\0\u1500\0\u1530\0\u1560\0\u1590\0\u15c0\0\u15f0"
|
||||
+ "\0\u1620\0\u1650\0\300\0\300\0\300\0\u1680\0\u1680\0\u16b0"
|
||||
+ "\0\u16e0\0\u1710\0\360\0\u1740\0\u0960\0\u1770\0\u17a0\0\u17d0"
|
||||
+ "\0\u1800\0\u1830\0\u1860\0\u1890\0\u18c0\0\u18f0\0\u1920\0\u1950"
|
||||
+ "\0\u1980\0\u19b0\0\u19e0\0\u1a10\0\u1a40\0\u1a70\0\u1aa0\0\u1ad0"
|
||||
+ "\0\u1b00\0\u1b30\0\u1b60\0\u1b90\0\u1bc0\0\u1bf0\0\u1c20\0\u1c50"
|
||||
+ "\0\u1c80\0\u1cb0\0\u1ce0\0\u1d10\0\u1d40\0\u1d70\0\u1da0\0\u1dd0"
|
||||
+ "\0\u1e00\0\u1e30\0\u1e60\0\u1e90\0\u1ec0\0\u1ef0\0\u1f20\0\u1f50"
|
||||
+ "\0\u1f80\0\u1fb0\0\u1fe0\0\u2010\0\u2040\0\u2070\0\u20a0\0\u20d0"
|
||||
+ "\0\u2100\0\u2130\0\u2160\0\u2190\0\u21c0\0\u21f0\0\u2220\0\u2250"
|
||||
+ "\0\u2280\0\u22b0\0\u22e0\0\u2310\0\u2340\0\u2370\0\u12f0\0\u23a0"
|
||||
+ "\0\u23d0\0\u2400\0\u2430\0\u2460\0\u2490\0\u24c0\0\u24f0\0\u2520"
|
||||
+ "\0\u2550\0\u2580\0\u25b0\0\u25e0\0\u2610\0\u2640\0\u2670\0\u26a0"
|
||||
+ "\0\u26d0\0\u2700\0\u2730\0\u2760\0\u2790\0\u27c0\0\u27f0\0\u2820"
|
||||
+ "\0\u2850\0\u2880\0\u28b0\0\u28e0\0\u2910\0\u2940\0\u2970\0\u29a0"
|
||||
+ "\0\u29d0\0\u2a00\0\u2a30\0\u2a60\0\u2a90\0\u2ac0\0\u2af0\0\u2b20"
|
||||
+ "\0\u2b50\0\u2b80\0\u2bb0\0\u2be0\0\u2c10\0\u2c40\0\u2c70\0\u2ca0"
|
||||
+ "\0\u2cd0\0\u2d00\0\u2d30\0\u2d60\0\u2d90\0\u2dc0\0\u2df0\0\u15f0"
|
||||
+ "\0\u2e20\0\u2e50\0\u2e80\0\u2eb0\0\u2ee0\0\u0c30\0\u2f10\0\u2f40"
|
||||
+ "\0\u2f70\0\u2fa0\0\u2fd0\0\u3000\0\u3030\0\u3060\0\u0ff0\0\u3090"
|
||||
+ "\0\u30c0\0\u2040\0\u30f0\0\u3120\0\u2ca0\0\u3150\0\u3180\0\u31b0"
|
||||
+ "\0\u31e0\0\u3210\0\u3240\0\u3270\0\u32a0\0\u32d0\0\u3300\0\u3330"
|
||||
+ "\0\u3360\0\u3390\0\u33c0\0\u33f0\0\u3420\0\u3450\0\u3480\0\u34b0"
|
||||
+ "\0\u34e0\0\u3510\0\u3540\0\u3570\0\u35a0\0\u35d0\0\u3600\0\u3630"
|
||||
+ "\0\u3660\0\u3690\0\u36c0\0\u36f0\0\u3720\0\u3750\0\u3780\0\u37b0"
|
||||
+ "\0\u37e0\0\u3810\0\u3840\0\u3870\0\u38a0\0\u38d0\0\u3900\0\u3930"
|
||||
+ "\0\u3960\0\u3990\0\u39c0\0\u39f0\0\u3a20\0\u3a50\0\u3a80\0\u3ab0"
|
||||
+ "\0\u3ae0\0\u3b10\0\u3b40\0\u3b70\0\u3ba0\0\u3bd0\0\u3c00\0\u3c30"
|
||||
+ "\0\u3c60\0\u3c90\0\u3cc0\0\u3cf0\0\u3d20\0\u3d50\0\u3d80\0\u3db0" + "\0\u3de0\0\u3e10";
|
||||
|
||||
private static int[] zzUnpackRowMap() {
|
||||
int[] result = new int[354];
|
||||
int offset = 0;
|
||||
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackRowMap(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int high = packed.charAt(i++) << 16;
|
||||
result[j++] = high | packed.charAt(i++);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* The transition table of the DFA
|
||||
*/
|
||||
private static final int[] ZZ_TRANS = zzUnpackTrans();
|
||||
private static final String ZZ_TRANS_PACKED_0 = "\1\5\1\6\1\7\1\10\1\11\1\5\1\12\1\13"
|
||||
+ "\1\14\1\13\1\15\1\13\1\16\1\17\1\20\1\21" + "\1\22\1\23\1\24\1\25\1\26\1\27\1\30\1\31"
|
||||
+ "\1\32\1\33\1\34\1\35\1\36\1\37\1\40\1\41" + "\1\42\1\43\1\44\1\7\1\45\2\10\1\46\1\10"
|
||||
+ "\1\47\1\50\1\7\1\51\1\52\1\53\1\5\1\54" + "\1\55\52\54\1\56\3\54\1\57\1\60\53\57\1\61"
|
||||
+ "\2\57\1\62\1\63\11\62\1\64\44\62\62\0\2\7" + "\1\0\1\7\12\0\34\7\7\0\1\10\13\0\1\21"
|
||||
+ "\1\65\24\0\2\10\1\0\1\10\13\0\1\11\62\0" + "\1\13\56\0\2\13\62\0\1\66\60\0\1\67\46\0"
|
||||
+ "\1\7\15\0\25\7\2\0\1\7\1\0\3\7\7\0" + "\1\21\14\0\1\65\24\0\2\21\1\0\1\21\11\0"
|
||||
+ "\2\7\1\0\1\7\12\0\23\7\1\70\10\7\6\0" + "\2\7\1\0\1\7\12\0\2\7\1\71\1\72\2\7"
|
||||
+ "\1\73\1\7\1\74\1\7\1\75\3\7\1\76\15\7" + "\6\0\2\7\1\0\1\7\12\0\1\77\1\100\3\7"
|
||||
+ "\1\101\5\7\1\102\1\103\17\7\6\0\2\7\1\0" + "\1\7\12\0\1\104\12\7\1\105\1\106\17\7\6\0"
|
||||
+ "\2\7\1\0\1\7\12\0\1\107\1\110\3\7\1\111" + "\1\7\1\112\3\7\1\113\1\114\17\7\6\0\2\7"
|
||||
+ "\1\0\1\7\12\0\1\115\13\7\1\116\17\7\6\0" + "\2\7\1\0\1\7\12\0\12\7\1\117\1\120\20\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\1\121\33\7\6\0" + "\2\7\1\0\1\7\12\0\1\122\3\7\1\123\2\7"
|
||||
+ "\1\124\2\7\1\125\1\126\1\127\1\130\3\7\1\131" + "\12\7\6\0\2\7\1\0\1\7\12\0\5\7\1\132"
|
||||
+ "\4\7\1\133\1\134\5\7\1\135\12\7\6\0\2\7" + "\1\0\1\7\12\0\6\7\1\136\1\7\1\137\11\7"
|
||||
+ "\1\140\11\7\6\0\2\7\1\0\1\7\12\0\3\7" + "\1\141\1\7\1\142\1\143\2\7\1\144\1\145\5\7"
|
||||
+ "\1\146\1\7\1\147\11\7\6\0\2\7\1\0\1\7" + "\12\0\6\7\1\150\1\7\1\143\4\7\1\113\11\7"
|
||||
+ "\1\151\4\7\6\0\2\7\1\0\1\7\12\0\1\152" + "\1\153\11\7\1\154\1\155\17\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\1\7\1\156\32\7\6\0\2\7\1\0" + "\1\7\12\0\1\157\6\7\1\160\3\7\1\161\1\162"
|
||||
+ "\17\7\6\0\2\7\1\0\1\7\12\0\14\7\1\163" + "\4\7\1\164\12\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\1\7\1\165\32\7\6\0\2\7\1\0\1\7\12\0" + "\1\166\1\167\3\7\1\170\5\7\1\171\1\172\17\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\3\7\1\173\1\7" + "\1\174\5\7\1\175\20\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\1\176\4\7\1\177\4\7\1\200\21\7\6\0" + "\2\7\1\0\1\7\12\0\13\7\1\201\20\7\6\0"
|
||||
+ "\2\7\1\0\1\7\12\0\1\202\33\7\4\0\57\53" + "\1\203\1\54\1\0\52\54\1\0\3\54\54\0\1\204"
|
||||
+ "\3\0\1\57\1\0\53\57\1\0\2\57\55\0\1\204" + "\2\0\1\62\1\0\11\62\1\0\44\62\14\0\1\205"
|
||||
+ "\46\0\1\206\5\0\2\207\32\0\2\206\1\0\1\206" + "\7\0\1\66\1\0\56\66\2\0\2\7\1\0\1\7"
|
||||
+ "\12\0\4\7\1\210\7\7\1\211\17\7\6\0\2\7" + "\1\0\1\7\12\0\2\7\1\143\31\7\6\0\2\7"
|
||||
+ "\1\0\1\7\12\0\3\7\1\143\1\137\27\7\6\0" + "\2\7\1\0\1\7\12\0\2\7\1\143\4\7\1\143"
|
||||
+ "\24\7\6\0\2\7\1\0\1\7\12\0\11\7\1\143" + "\22\7\6\0\2\7\1\0\1\7\12\0\4\7\1\212"
|
||||
+ "\27\7\6\0\2\7\1\0\1\7\12\0\1\7\1\143" + "\25\7\1\213\4\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\3\7\1\214\4\7\1\215\23\7\6\0\2\7\1\0" + "\1\7\12\0\4\7\1\216\27\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\13\7\1\113\20\7\6\0\2\7\1\0" + "\1\7\12\0\12\7\1\217\21\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\10\7\1\220\23\7\6\0\2\7\1\0" + "\1\7\12\0\16\7\1\221\5\7\1\120\7\7\6\0"
|
||||
+ "\2\7\1\0\1\7\12\0\6\7\1\222\11\7\1\223" + "\6\7\1\224\4\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\32\7\1\225\1\7\6\0\2\7\1\0\1\7\12\0" + "\23\7\1\120\10\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\17\7\1\226\14\7\6\0\2\7\1\0\1\7\12\0" + "\1\7\1\227\12\7\1\230\17\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\22\7\1\225\11\7\6\0\2\7\1\0" + "\1\7\12\0\22\7\1\143\11\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\15\7\1\231\16\7\6\0\2\7\1\0" + "\1\7\12\0\1\7\1\232\22\7\1\233\7\7\6\0"
|
||||
+ "\2\7\1\0\1\7\12\0\27\7\1\234\4\7\6\0" + "\2\7\1\0\1\7\12\0\3\7\1\232\11\7\1\235"
|
||||
+ "\16\7\6\0\2\7\1\0\1\7\12\0\4\7\1\143" + "\27\7\6\0\2\7\1\0\1\7\12\0\10\7\1\236"
|
||||
+ "\23\7\6\0\2\7\1\0\1\7\12\0\3\7\1\237" + "\1\143\3\7\1\240\23\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\2\7\1\241\2\7\1\242\26\7\6\0\2\7" + "\1\0\1\7\12\0\10\7\1\243\23\7\6\0\2\7"
|
||||
+ "\1\0\1\7\12\0\15\7\1\143\1\7\1\244\14\7" + "\6\0\2\7\1\0\1\7\12\0\15\7\1\225\16\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\6\7\1\245\25\7" + "\6\0\2\7\1\0\1\7\12\0\1\7\1\246\32\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\13\7\1\247\20\7" + "\6\0\2\7\1\0\1\7\12\0\1\250\33\7\6\0"
|
||||
+ "\2\7\1\0\1\7\12\0\5\7\1\251\26\7\6\0" + "\2\7\1\0\1\7\12\0\3\7\1\252\2\7\1\253"
|
||||
+ "\3\7\1\254\21\7\6\0\2\7\1\0\1\7\12\0" + "\1\7\1\255\32\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\14\7\1\256\17\7\6\0\2\7\1\0\1\7\12\0" + "\1\257\33\7\6\0\2\7\1\0\1\7\12\0\2\7"
|
||||
+ "\1\250\17\7\1\223\11\7\6\0\2\7\1\0\1\7" + "\12\0\1\260\33\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\2\7\1\137\31\7\6\0\2\7\1\0\1\7\12\0" + "\4\7\1\261\27\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\4\7\1\137\27\7\6\0\2\7\1\0\1\7\12\0" + "\6\7\1\262\25\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\4\7\1\263\27\7\6\0\2\7\1\0\1\7\12\0" + "\2\7\1\264\1\7\1\265\1\7\1\137\1\7\1\266"
|
||||
+ "\23\7\6\0\2\7\1\0\1\7\12\0\6\7\1\267" + "\25\7\6\0\2\7\1\0\1\7\12\0\15\7\1\270"
|
||||
+ "\16\7\6\0\2\7\1\0\1\7\12\0\23\7\1\143" + "\10\7\6\0\2\7\1\0\1\7\12\0\2\7\1\143"
|
||||
+ "\3\7\1\50\25\7\6\0\2\7\1\0\1\7\12\0" + "\6\7\1\143\25\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\3\7\1\271\1\7\1\272\26\7\6\0\2\7\1\0" + "\1\7\12\0\4\7\1\273\27\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\4\7\1\225\27\7\6\0\2\7\1\0" + "\1\7\12\0\13\7\1\274\20\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\4\7\1\275\1\7\1\276\25\7\6\0" + "\2\7\1\0\1\7\12\0\4\7\1\277\27\7\6\0"
|
||||
+ "\2\7\1\0\1\7\12\0\1\300\33\7\6\0\2\7" + "\1\0\1\7\12\0\16\7\1\242\15\7\6\0\2\7"
|
||||
+ "\1\0\1\7\12\0\5\7\1\301\26\7\6\0\2\7" + "\1\0\1\7\12\0\5\7\1\302\2\7\1\303\23\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\14\7\1\304\17\7" + "\6\0\2\7\1\0\1\7\12\0\10\7\1\305\23\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\16\7\1\306\15\7" + "\6\0\2\7\1\0\1\7\12\0\13\7\1\307\20\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\13\7\1\310\20\7" + "\6\0\2\7\1\0\1\7\12\0\5\7\1\311\26\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\6\7\1\312\25\7" + "\6\0\2\7\1\0\1\7\12\0\13\7\1\313\20\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\14\7\1\71\17\7" + "\6\0\2\7\1\0\1\7\12\0\14\7\1\155\17\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\7\7\1\143\24\7" + "\7\0\1\206\41\0\2\206\1\0\1\206\11\0\2\7"
|
||||
+ "\1\0\1\7\12\0\5\7\1\314\26\7\6\0\2\7" + "\1\0\1\7\12\0\10\7\1\315\23\7\6\0\2\7"
|
||||
+ "\1\0\1\7\12\0\13\7\1\316\20\7\6\0\2\7" + "\1\0\1\7\12\0\1\317\33\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\1\320\1\321\32\7\6\0\2\7\1\0" + "\1\7\12\0\17\7\1\322\14\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\1\7\1\323\2\7\1\324\27\7\6\0" + "\2\7\1\0\1\7\12\0\1\232\33\7\6\0\2\7"
|
||||
+ "\1\0\1\7\12\0\27\7\1\325\4\7\6\0\2\7" + "\1\0\1\7\12\0\1\326\33\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\14\7\1\327\17\7\6\0\2\7\1\0" + "\1\7\12\0\1\143\33\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\3\7\1\330\30\7\6\0\2\7\1\0\1\7" + "\12\0\6\7\1\331\25\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\15\7\1\213\16\7\6\0\2\7\1\0\1\7" + "\12\0\1\332\33\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\3\7\1\143\30\7\6\0\2\7\1\0\1\7\12\0" + "\1\333\33\7\6\0\2\7\1\0\1\7\12\0\21\7"
|
||||
+ "\1\120\12\7\6\0\2\7\1\0\1\7\12\0\1\334" + "\16\7\1\137\14\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\6\7\1\270\25\7\6\0\2\7\1\0\1\7\12\0" + "\1\335\33\7\6\0\2\7\1\0\1\7\12\0\10\7"
|
||||
+ "\1\336\23\7\6\0\2\7\1\0\1\7\12\0\1\337" + "\33\7\6\0\2\7\1\0\1\7\12\0\14\7\1\340"
|
||||
+ "\17\7\6\0\2\7\1\0\1\7\12\0\4\7\1\341" + "\27\7\6\0\2\7\1\0\1\7\12\0\10\7\1\342"
|
||||
+ "\23\7\6\0\2\7\1\0\1\7\12\0\27\7\1\322" + "\4\7\6\0\2\7\1\0\1\7\12\0\3\7\1\343"
|
||||
+ "\30\7\6\0\2\7\1\0\1\7\12\0\5\7\1\120" + "\26\7\6\0\2\7\1\0\1\7\12\0\1\7\1\317"
|
||||
+ "\32\7\6\0\2\7\1\0\1\7\12\0\5\7\1\344" + "\26\7\6\0\2\7\1\0\1\7\12\0\12\7\1\345"
|
||||
+ "\21\7\6\0\2\7\1\0\1\7\12\0\10\7\1\346" + "\1\347\4\7\1\350\15\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\6\7\1\351\25\7\6\0\2\7\1\0\1\7" + "\12\0\5\7\1\352\26\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\13\7\1\155\17\7\1\353\6\0\2\7\1\0" + "\1\7\12\0\5\7\1\143\26\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\13\7\1\354\20\7\6\0\2\7\1\0" + "\1\7\12\0\1\355\33\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\1\356\33\7\6\0\2\7\1\0\1\7\12\0" + "\14\7\1\357\17\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\1\153\33\7\6\0\2\7\1\0\1\7\12\0\1\360" + "\12\7\1\143\20\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\1\247\33\7\6\0\2\7\1\0\1\7\12\0\13\7" + "\1\300\20\7\6\0\2\7\1\0\1\7\12\0\13\7"
|
||||
+ "\1\143\20\7\6\0\2\7\1\0\1\7\12\0\12\7" + "\1\361\21\7\6\0\2\7\1\0\1\7\12\0\11\7"
|
||||
+ "\1\362\5\7\1\363\2\7\1\143\11\7\6\0\2\7" + "\1\0\1\7\12\0\20\7\1\364\13\7\6\0\2\7"
|
||||
+ "\1\0\1\7\12\0\3\7\1\365\30\7\6\0\2\7" + "\1\0\1\366\12\0\34\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\1\7\1\367\32\7\6\0\2\7\1\0\1\7" + "\12\0\21\7\1\143\12\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\5\7\1\225\26\7\6\0\2\7\1\0\1\7" + "\12\0\11\7\1\370\22\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\1\7\1\371\32\7\6\0\2\7\1\0\1\7" + "\12\0\10\7\1\372\23\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\15\7\1\276\16\7\6\0\2\7\1\0\1\7" + "\12\0\14\7\1\373\17\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\13\7\1\120\20\7\6\0\2\7\1\0\1\7" + "\12\0\1\7\1\374\32\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\15\7\1\143\16\7\6\0\2\7\1\0\1\7" + "\12\0\1\375\33\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\1\376\33\7\6\0\2\7\1\0\1\7\12\0\12\7" + "\1\113\21\7\6\0\2\7\1\0\1\7\12\0\1\7"
|
||||
+ "\1\377\32\7\6\0\2\7\1\0\1\7\12\0\4\7" + "\1\u0100\27\7\6\0\2\7\1\0\1\7\12\0\14\7"
|
||||
+ "\1\u0101\17\7\6\0\2\7\1\0\1\7\12\0\4\7" + "\1\u0102\27\7\6\0\2\7\1\0\1\7\12\0\17\7"
|
||||
+ "\1\u0103\14\7\6\0\2\7\1\0\1\7\12\0\3\7" + "\1\225\30\7\6\0\2\7\1\0\1\7\12\0\3\7"
|
||||
+ "\1\u0104\30\7\6\0\2\7\1\0\1\7\12\0\14\7" + "\1\u0105\17\7\6\0\2\7\1\0\1\7\12\0\4\7"
|
||||
+ "\1\u0106\12\7\1\363\14\7\6\0\2\7\1\0\1\7" + "\12\0\5\7\1\213\26\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\11\7\1\u0107\22\7\6\0\2\7\1\0\1\7" + "\12\0\1\u0108\33\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\10\7\1\u0109\23\7\6\0\2\7\1\0\1\7\12\0" + "\10\7\1\u010a\23\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\5\7\1\u010b\26\7\6\0\2\7\1\0\1\7\12\0" + "\5\7\1\u010c\26\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\11\7\1\120\22\7\6\0\2\7\1\0\1\7\12\0" + "\14\7\1\u010d\17\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\16\7\1\u010e\15\7\6\0\2\7\1\0\1\7\12\0" + "\6\7\1\u010f\25\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\1\u0110\33\7\6\0\2\7\1\0\1\7\12\0\4\7" + "\1\u0111\27\7\6\0\2\7\1\0\1\7\12\0\3\7"
|
||||
+ "\1\u0112\30\7\6\0\2\7\1\0\1\7\12\0\1\u0113" + "\33\7\6\0\2\7\1\0\1\7\12\0\15\7\1\155"
|
||||
+ "\16\7\6\0\2\7\1\0\1\7\12\0\4\7\1\u0114" + "\27\7\6\0\2\7\1\0\1\7\12\0\1\7\1\u0115"
|
||||
+ "\32\7\6\0\2\7\1\0\1\7\12\0\1\u0116\33\7" + "\6\0\2\7\1\0\1\7\12\0\4\7\1\u0117\27\7"
|
||||
+ "\6\0\2\7\1\0\1\366\12\0\1\7\1\u0118\32\7" + "\6\0\2\7\1\0\1\7\12\0\12\7\1\225\21\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\17\7\1\u0119\14\7" + "\6\0\2\7\1\0\1\7\12\0\4\7\1\u011a\27\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\5\7\1\u011b\26\7" + "\6\0\2\7\1\0\1\7\12\0\13\7\1\155\20\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\27\7\1\u011c\4\7" + "\6\0\2\7\1\0\1\7\12\0\1\u011d\33\7\6\0"
|
||||
+ "\2\7\1\0\1\7\12\0\21\7\1\u011e\12\7\6\0" + "\2\7\1\0\1\7\12\0\14\7\1\u011f\17\7\6\0"
|
||||
+ "\2\7\1\0\1\7\12\0\1\u0120\33\7\6\0\2\7" + "\1\0\1\7\12\0\1\u0121\33\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\3\7\1\u0122\30\7\6\0\2\7\1\0" + "\1\7\12\0\5\7\1\202\26\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\1\u0123\33\7\6\0\2\7\1\0\1\7" + "\12\0\15\7\1\u0124\16\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\20\7\1\u0125\13\7\6\0\2\7\1\0\1\7" + "\12\0\4\7\1\u0126\27\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\4\7\1\u0127\27\7\6\0\2\7\1\0\1\7" + "\12\0\14\7\1\u0128\17\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\5\7\1\u0107\26\7\6\0\2\7\1\0\1\7" + "\12\0\11\7\1\u0129\22\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\10\7\1\143\23\7\6\0\2\7\1\0\1\7" + "\12\0\6\7\1\u012a\25\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\14\7\1\126\17\7\6\0\2\7\1\0\1\7" + "\12\0\1\7\1\u012b\32\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\3\7\1\u012c\30\7\6\0\2\7\1\0\1\7" + "\12\0\6\7\1\u012d\25\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\1\107\33\7\6\0\2\7\1\0\1\7\12\0" + "\1\7\1\232\32\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\3\7\1\u012e\20\7\1\u012f\7\7\6\0\2\7\1\0" + "\1\7\12\0\4\7\1\u0130\27\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\1\u0131\33\7\6\0\2\7\1\0\1\7" + "\12\0\14\7\1\215\17\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\13\7\1\u0132\20\7\6\0\2\7\1\0\1\7" + "\12\0\27\7\1\143\4\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\15\7\1\u0133\16\7\6\0\2\7\1\0\1\7" + "\12\0\5\7\1\u0134\26\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\14\7\1\u0123\17\7\6\0\2\7\1\0\1\7" + "\12\0\6\7\1\u0135\25\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\5\7\1\u0136\26\7\6\0\2\7\1\0\1\7" + "\12\0\4\7\1\u0137\27\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\5\7\1\u0129\26\7\6\0\2\7\1\0\1\7" + "\12\0\11\7\1\145\22\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\31\7\1\237\2\7\6\0\2\7\1\0\1\7" + "\12\0\1\7\1\u0138\32\7\6\0\2\7\1\0\1\7"
|
||||
+ "\12\0\1\u0139\33\7\6\0\2\7\1\0\1\7\12\0" + "\1\7\1\257\32\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\6\7\1\276\25\7\6\0\2\7\1\0\1\7\12\0" + "\1\155\33\7\6\0\2\7\1\0\1\7\12\0\1\7"
|
||||
+ "\1\155\32\7\6\0\2\7\1\0\1\7\12\0\1\u013a" + "\33\7\6\0\2\7\1\0\1\7\12\0\6\7\1\120"
|
||||
+ "\25\7\6\0\2\7\1\0\1\7\12\0\1\u013b\33\7" + "\6\0\2\7\1\0\1\7\12\0\13\7\1\u013c\20\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\14\7\1\u013d\17\7" + "\6\0\2\7\1\0\1\7\12\0\25\7\2\143\5\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\27\7\1\155\4\7" + "\6\0\2\7\1\0\1\7\12\0\4\7\1\213\27\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\11\7\1\u013e\22\7" + "\6\0\2\7\1\0\1\7\12\0\10\7\1\225\23\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\13\7\1\u013f\20\7" + "\6\0\2\7\1\0\1\7\12\0\11\7\1\u0140\22\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\1\7\1\u0141\32\7" + "\6\0\2\7\1\0\1\7\12\0\13\7\1\u0142\20\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\1\7\1\u0143\32\7" + "\6\0\2\7\1\0\1\7\12\0\6\7\1\u0144\25\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\6\7\1\u0133\25\7" + "\6\0\2\7\1\0\1\u0145\12\0\34\7\6\0\2\7"
|
||||
+ "\1\0\1\7\12\0\14\7\1\u0146\17\7\6\0\2\7" + "\1\0\1\7\12\0\4\7\1\u0147\4\7\1\202\22\7"
|
||||
+ "\6\0\2\7\1\0\1\7\12\0\1\7\1\u0112\32\7" + "\6\0\2\7\1\0\1\7\12\0\1\u0148\33\7\6\0"
|
||||
+ "\2\7\1\0\1\7\12\0\11\7\1\u0149\22\7\6\0" + "\2\7\1\0\1\7\12\0\5\7\1\u014a\26\7\6\0"
|
||||
+ "\2\7\1\0\1\7\12\0\6\7\1\u014b\25\7\6\0" + "\2\7\1\0\1\7\12\0\4\7\1\u014c\27\7\6\0"
|
||||
+ "\2\7\1\0\1\7\12\0\5\7\1\71\26\7\6\0" + "\2\7\1\0\1\7\12\0\13\7\1\u014d\20\7\6\0"
|
||||
+ "\2\7\1\0\1\7\12\0\5\7\1\u014e\26\7\6\0" + "\2\7\1\0\1\7\12\0\20\7\1\143\13\7\6\0"
|
||||
+ "\2\7\1\0\1\7\12\0\4\7\1\u014f\27\7\6\0" + "\2\7\1\0\1\7\12\0\4\7\1\u0150\27\7\6\0"
|
||||
+ "\2\7\1\0\1\7\12\0\5\7\1\310\26\7\6\0" + "\2\7\1\0\1\7\12\0\15\7\1\113\16\7\6\0"
|
||||
+ "\2\7\1\0\1\7\12\0\11\7\1\u0151\22\7\6\0" + "\2\7\1\0\1\7\12\0\12\7\1\u0152\21\7\6\0"
|
||||
+ "\2\7\1\0\1\7\12\0\6\7\1\u0153\25\7\6\0" + "\2\7\1\0\1\u0154\12\0\34\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\6\7\1\u012e\25\7\6\0\2\7\1\0" + "\1\7\12\0\11\7\1\u0155\22\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\25\7\1\143\2\7\1\143\3\7\6\0" + "\2\7\1\0\1\7\12\0\27\7\1\u0156\4\7\6\0"
|
||||
+ "\2\7\1\0\1\7\12\0\1\u0157\33\7\6\0\2\7" + "\1\0\1\7\12\0\6\7\1\213\25\7\6\0\2\7"
|
||||
+ "\1\0\1\7\12\0\1\u0158\33\7\6\0\2\7\1\0" + "\1\7\12\0\5\7\1\u012c\26\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\1\213\33\7\6\0\2\7\1\0\1\7" + "\12\0\1\u0100\33\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\10\7\1\223\23\7\6\0\2\7\1\0\1\7\12\0" + "\27\7\1\213\4\7\6\0\2\7\1\0\1\7\12\0"
|
||||
+ "\2\7\1\u012e\1\7\1\u0159\5\7\1\u0152\21\7\6\0" + "\2\7\1\0\1\7\12\0\1\u015a\33\7\6\0\2\7"
|
||||
+ "\1\0\1\7\12\0\4\7\1\u015b\27\7\6\0\2\7" + "\1\0\1\7\12\0\5\7\1\u0100\26\7\6\0\2\7"
|
||||
+ "\1\0\1\7\12\0\15\7\1\370\16\7\6\0\2\7" + "\1\0\1\7\12\0\14\7\1\u015c\17\7\6\0\2\7"
|
||||
+ "\1\0\1\7\12\0\10\7\1\u0100\23\7\6\0\2\7" + "\1\0\1\7\12\0\21\7\1\213\12\7\6\0\2\7"
|
||||
+ "\1\0\1\7\12\0\15\7\1\u015d\16\7\6\0\2\7" + "\1\0\1\7\12\0\1\u015e\33\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\10\7\1\u015f\23\7\6\0\2\7\1\0" + "\1\7\12\0\4\7\1\u0160\27\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\1\7\1\u0161\32\7\6\0\2\7\1\0" + "\1\7\12\0\15\7\1\u0162\16\7\6\0\2\7\1\0"
|
||||
+ "\1\7\12\0\22\7\1\213\11\7\4\0";
|
||||
|
||||
private static int[] zzUnpackTrans() {
|
||||
int[] result = new int[15936];
|
||||
int offset = 0;
|
||||
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackTrans(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
value--;
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/* error codes */
|
||||
private static final int ZZ_UNKNOWN_ERROR = 0;
|
||||
private static final int ZZ_NO_MATCH = 1;
|
||||
private static final int ZZ_PUSHBACK_2BIG = 2;
|
||||
/* error messages for the codes above */
|
||||
private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input",
|
||||
"Error: pushback value was too large" };
|
||||
/**
|
||||
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
|
||||
*/
|
||||
private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 = "\4\0\2\11\4\1\1\11\3\1\1\11\31\1\2\11"
|
||||
+ "\2\1\1\11\2\1\1\11\2\1\1\11\1\1\1\0" + "\1\1\1\11\113\1\3\11\1\1\1\0\333\1";
|
||||
|
||||
private static int[] zzUnpackAttribute() {
|
||||
int[] result = new int[354];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAttribute(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/** the input device */
|
||||
private java.io.Reader zzReader;
|
||||
/** the current state of the DFA */
|
||||
private int zzState;
|
||||
/** the current lexical state */
|
||||
private int zzLexicalState = YYINITIAL;
|
||||
/**
|
||||
* this buffer contains the current text to be matched and is the source of the
|
||||
* yytext() string
|
||||
*/
|
||||
private char zzBuffer[];
|
||||
/** the textposition at the last accepting state */
|
||||
private int zzMarkedPos;
|
||||
/** the current text position in the buffer */
|
||||
private int zzCurrentPos;
|
||||
/** startRead marks the beginning of the yytext() string in the buffer */
|
||||
private int zzStartRead;
|
||||
/**
|
||||
* endRead marks the last character in the buffer, that has been read from input
|
||||
*/
|
||||
private int zzEndRead;
|
||||
/** zzAtEOF == true <=> the scanner is at the EOF */
|
||||
private boolean zzAtEOF;
|
||||
/* user code: */
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a no-parameter
|
||||
* constructor.
|
||||
*/
|
||||
public SQLTokenMaker() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos - 1, tokenType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start, end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
/**
|
||||
* Overridden to return <code>true</code> so paren matching occurs for SQL.
|
||||
*
|
||||
* @return <code>true</code> always.
|
||||
*/
|
||||
@Override
|
||||
public boolean getCurlyBracesDenoteCodeBlocks(int languageIndex) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "--", null };
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated from
|
||||
* <code>text</code>. This method must be implemented by subclasses so they can
|
||||
* correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing the syntax
|
||||
* highlighted text.
|
||||
*/
|
||||
@Override
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = STRING;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.LITERAL_CHAR:
|
||||
state = CHAR;
|
||||
start = text.offset;
|
||||
break;
|
||||
case Token.COMMENT_MULTILINE:
|
||||
state = MLC;
|
||||
start = text.offset;
|
||||
break;
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos >= s.offset + s.count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream. Does not close the old
|
||||
* reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream <b>cannot</b> be
|
||||
* reused (internal buffer is discarded and lost). Lexical state is set to
|
||||
* <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill no longer
|
||||
* "refills" the buffer (since the way we do it, it's always "full" the first
|
||||
* time through, since it points to the segment's array). So, we assign
|
||||
* zzEndRead here.
|
||||
*/
|
||||
// zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner There is also a java.io.InputStream version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
public SQLTokenMaker(java.io.Reader in) {
|
||||
this.zzReader = in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner. There is also java.io.Reader version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Inputstream to read input from.
|
||||
*/
|
||||
public SQLTokenMaker(java.io.InputStream in) {
|
||||
this(new java.io.InputStreamReader(in));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unpacks the compressed character translation table.
|
||||
*
|
||||
* @param packed the packed character translation table
|
||||
* @return the unpacked character translation table
|
||||
*/
|
||||
private static char[] zzUnpackCMap(String packed) {
|
||||
char[] map = new char[0x10000];
|
||||
int i = 0; /* index in packed string */
|
||||
int j = 0; /* index in unpacked array */
|
||||
while (i < 178) {
|
||||
int count = packed.charAt(i++);
|
||||
char value = packed.charAt(i++);
|
||||
do
|
||||
map[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the input stream.
|
||||
*/
|
||||
public final void yyclose() throws java.io.IOException {
|
||||
zzAtEOF = true; /* indicate end of file */
|
||||
zzEndRead = zzStartRead; /* invalidate buffer */
|
||||
if (zzReader != null)
|
||||
zzReader.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current lexical state.
|
||||
*/
|
||||
public final int yystate() {
|
||||
return zzLexicalState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enters a new lexical state
|
||||
*
|
||||
* @param newState the new lexical state
|
||||
*/
|
||||
@Override
|
||||
public final void yybegin(int newState) {
|
||||
zzLexicalState = newState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the text matched by the current regular expression.
|
||||
*/
|
||||
public final String yytext() {
|
||||
return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character at position <tt>pos</tt> from the matched text.
|
||||
*
|
||||
* It is equivalent to yytext().charAt(pos), but faster
|
||||
*
|
||||
* @param pos the position of the character to fetch. A value from 0 to
|
||||
* yylength()-1.
|
||||
*
|
||||
* @return the character at position pos
|
||||
*/
|
||||
public final char yycharat(int pos) {
|
||||
return zzBuffer[zzStartRead + pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the length of the matched text region.
|
||||
*/
|
||||
public final int yylength() {
|
||||
return zzMarkedPos - zzStartRead;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports an error that occured while scanning.
|
||||
*
|
||||
* In a wellformed scanner (no or only correct usage of yypushback(int) and a
|
||||
* match-all fallback rule) this method will only be called with things that
|
||||
* "Can't Possibly Happen". If this method is called, something is seriously
|
||||
* wrong (e.g. a JFlex bug producing a faulty scanner etc.).
|
||||
*
|
||||
* Usual syntax/scanner level error handling should be done in error fallback
|
||||
* rules.
|
||||
*
|
||||
* @param errorCode the code of the errormessage to display
|
||||
*/
|
||||
private void zzScanError(int errorCode) {
|
||||
String message;
|
||||
try {
|
||||
message = ZZ_ERROR_MSG[errorCode];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
|
||||
}
|
||||
throw new Error(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes the specified amount of characters back into the input stream.
|
||||
*
|
||||
* They will be read again by then next call of the scanning method
|
||||
*
|
||||
* @param number the number of characters to be read again. This number must not
|
||||
* be greater than yylength()!
|
||||
*/
|
||||
public void yypushback(int number) {
|
||||
if (number > yylength())
|
||||
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||
zzMarkedPos -= number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resumes scanning until the next regular expression is matched, the end of
|
||||
* input is encountered or an I/O-Error occurs.
|
||||
*
|
||||
* @return the next token
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
|
||||
int zzInput;
|
||||
int zzAction;
|
||||
// cached fields:
|
||||
int zzCurrentPosL;
|
||||
int zzMarkedPosL;
|
||||
int zzEndReadL = zzEndRead;
|
||||
char[] zzBufferL = zzBuffer;
|
||||
char[] zzCMapL = ZZ_CMAP;
|
||||
int[] zzTransL = ZZ_TRANS;
|
||||
int[] zzRowMapL = ZZ_ROWMAP;
|
||||
int[] zzAttrL = ZZ_ATTRIBUTE;
|
||||
while (true) {
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzAction = -1;
|
||||
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
|
||||
zzState = zzLexicalState;
|
||||
zzForAction: {
|
||||
while (true) {
|
||||
if (zzCurrentPosL < zzEndReadL)
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
else if (zzAtEOF) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
// store back cached positions
|
||||
zzCurrentPos = zzCurrentPosL;
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
boolean eof = zzRefill();
|
||||
// get translated positions and possibly new buffer
|
||||
zzCurrentPosL = zzCurrentPos;
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzBufferL = zzBuffer;
|
||||
zzEndReadL = zzEndRead;
|
||||
if (eof) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
}
|
||||
}
|
||||
int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
|
||||
if (zzNext == -1)
|
||||
break zzForAction;
|
||||
zzState = zzNext;
|
||||
int zzAttributes = zzAttrL[zzState];
|
||||
if ((zzAttributes & 1) == 1) {
|
||||
zzAction = zzState;
|
||||
zzMarkedPosL = zzCurrentPosL;
|
||||
if ((zzAttributes & 8) == 8)
|
||||
break zzForAction;
|
||||
}
|
||||
}
|
||||
}
|
||||
// store back cached position
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||
case 20: {
|
||||
addToken(Token.PREPROCESSOR);
|
||||
}
|
||||
case 23:
|
||||
break;
|
||||
case 2: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 24:
|
||||
break;
|
||||
case 21: {
|
||||
yybegin(YYINITIAL);
|
||||
addToken(start, zzStartRead + 1, Token.COMMENT_MULTILINE);
|
||||
}
|
||||
case 25:
|
||||
break;
|
||||
case 18: {
|
||||
start = zzMarkedPos - 2;
|
||||
yybegin(MLC);
|
||||
}
|
||||
case 26:
|
||||
break;
|
||||
case 4: {
|
||||
addToken(Token.WHITESPACE);
|
||||
}
|
||||
case 27:
|
||||
break;
|
||||
case 14: {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_CHAR);
|
||||
return firstToken;
|
||||
}
|
||||
case 28:
|
||||
break;
|
||||
case 9: {
|
||||
start = zzMarkedPos - 1;
|
||||
yybegin(CHAR);
|
||||
}
|
||||
case 29:
|
||||
break;
|
||||
case 7: {
|
||||
addToken(Token.LITERAL_NUMBER_FLOAT);
|
||||
}
|
||||
case 30:
|
||||
break;
|
||||
case 19: {
|
||||
addToken(Token.RESERVED_WORD);
|
||||
}
|
||||
case 31:
|
||||
break;
|
||||
case 6: {
|
||||
addToken(Token.SEPARATOR);
|
||||
}
|
||||
case 32:
|
||||
break;
|
||||
case 15: {
|
||||
yybegin(YYINITIAL);
|
||||
addToken(start, zzStartRead, Token.LITERAL_CHAR);
|
||||
}
|
||||
case 33:
|
||||
break;
|
||||
case 1: {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
case 34:
|
||||
break;
|
||||
case 22: {
|
||||
addToken(Token.FUNCTION);
|
||||
}
|
||||
case 35:
|
||||
break;
|
||||
case 12: {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
return firstToken;
|
||||
}
|
||||
case 36:
|
||||
break;
|
||||
case 17: {
|
||||
addToken(Token.COMMENT_EOL);
|
||||
}
|
||||
case 37:
|
||||
break;
|
||||
case 8: {
|
||||
start = zzMarkedPos - 1;
|
||||
yybegin(STRING);
|
||||
}
|
||||
case 38:
|
||||
break;
|
||||
case 3: {
|
||||
addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
|
||||
}
|
||||
case 39:
|
||||
break;
|
||||
case 5: {
|
||||
addToken(Token.OPERATOR);
|
||||
}
|
||||
case 40:
|
||||
break;
|
||||
case 13: {
|
||||
yybegin(YYINITIAL);
|
||||
addToken(start, zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
}
|
||||
case 41:
|
||||
break;
|
||||
case 10: {
|
||||
addToken(Token.ERROR_IDENTIFIER);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 42:
|
||||
break;
|
||||
case 11: {
|
||||
}
|
||||
case 43:
|
||||
break;
|
||||
case 16: {
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_MULTILINE);
|
||||
return firstToken;
|
||||
}
|
||||
case 44:
|
||||
break;
|
||||
default:
|
||||
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
|
||||
zzAtEOF = true;
|
||||
switch (zzLexicalState) {
|
||||
case STRING: {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
return firstToken;
|
||||
}
|
||||
case 355:
|
||||
break;
|
||||
case YYINITIAL: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 356:
|
||||
break;
|
||||
case MLC: {
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_MULTILINE);
|
||||
return firstToken;
|
||||
}
|
||||
case 357:
|
||||
break;
|
||||
case CHAR: {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_CHAR);
|
||||
return firstToken;
|
||||
}
|
||||
case 358:
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,383 +0,0 @@
|
||||
/*
|
||||
* 8/19/2009
|
||||
*
|
||||
* ScalaTokenMaker.java - Scanner for the Scala programming language.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for the Scala programming language.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>ScalaTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class ScalaTokenMaker
|
||||
%extends AbstractJFlexCTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public ScalaTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addHyperlinkToken(int, int, int)
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
* @param hyperlink Whether this token is a hyperlink.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType,
|
||||
int startOffset, boolean hyperlink) {
|
||||
super.addToken(array, start,end, tokenType, startOffset, hyperlink);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "//", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = YYINITIAL;
|
||||
switch (initialTokenType) {
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = MULTILINE_STRING_DOUBLE;
|
||||
break;
|
||||
case Token.COMMENT_MULTILINE:
|
||||
state = MLC;
|
||||
break;
|
||||
default:
|
||||
state = YYINITIAL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
start = text.offset;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
|
||||
/***** BEGIN SCALA-SPECIFIC CHANGES *********/
|
||||
Upper = ([A-Z\$\_]) /* Plus Unicode category Lu */
|
||||
Lower = ([a-z]) /* Plus Unicode category Ll */
|
||||
Letter = ({Upper}|{Lower}) /*Plus Unicode categories Lo, Lt, Nl */
|
||||
Digit = ([0-9])
|
||||
OpChar = ([^A-Z\$\_a-z0-9\(\[\]\)\. \t\f])
|
||||
Op = ({OpChar}+)
|
||||
IdRest = (({Letter}|{Digit})*([\_]{Op})?)
|
||||
VarId = ({Lower}{IdRest})
|
||||
PlainId = ({Upper}{IdRest}|{VarId}) /*|{Op})*/
|
||||
Id = ({PlainId}) /*({PlainId}|[\']{StringLit}[\'])*/
|
||||
|
||||
IntegerLiteral = ({Digit}+[Ll]?)
|
||||
HexDigit = ({Digit}|[A-Fa-f])
|
||||
HexLiteral = ("0x"{HexDigit}+)
|
||||
|
||||
ExponentPart = ([Ee][+\-]?{Digit}+)
|
||||
FloatType = ([FfDd])
|
||||
FloatingPointLiteral = ({Digit}+[\.]{Digit}*{ExponentPart}?{FloatType}? |
|
||||
[\.]{Digit}+{ExponentPart}?{FloatType}? |
|
||||
{Digit}+{ExponentPart}{FloatType}? |
|
||||
{Digit}+{ExponentPart}?{FloatType})
|
||||
|
||||
UnclosedCharLiteral = ([\']([\\].|[^\\\'])*[^\']?)
|
||||
CharLiteral = ({UnclosedCharLiteral}[\'])
|
||||
UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
|
||||
StringLiteral = ({UnclosedStringLiteral}[\"])
|
||||
UnclosedBacktickLiteral = ([\`][^\`]+)
|
||||
BacktickLiteral = ({UnclosedBacktickLiteral}[\`])
|
||||
/* TODO: Multiline strings */
|
||||
|
||||
MLCBegin = ("/*")
|
||||
MLCEnd = ("*/")
|
||||
LineCommentBegin = ("//")
|
||||
|
||||
/***** END SCALA-SPECIFIC CHANGES *********/
|
||||
|
||||
Whitespace = ([ \t\f]+)
|
||||
LineTerminator = ([\n])
|
||||
Separator = ([\(\)\{\}\[\]])
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ({Letter}|[\_]|{Digit}|[\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$]|{Letter}|{Digit})
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
|
||||
%state MULTILINE_STRING_DOUBLE
|
||||
%state MLC
|
||||
%state EOL_COMMENT
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
/* Keywords */
|
||||
"abstract" |
|
||||
"case" |
|
||||
"catch" |
|
||||
"class" |
|
||||
"def" |
|
||||
"do" |
|
||||
"else" |
|
||||
"extends" |
|
||||
"false" |
|
||||
"final" |
|
||||
"finally" |
|
||||
"for" |
|
||||
"forSome" |
|
||||
"if" |
|
||||
"implicit" |
|
||||
"import" |
|
||||
"lazy" |
|
||||
"match" |
|
||||
"new" |
|
||||
"null" |
|
||||
"object" |
|
||||
"override" |
|
||||
"package" |
|
||||
"private" |
|
||||
"protected" |
|
||||
"requires" |
|
||||
"return" |
|
||||
"sealed" |
|
||||
"super" |
|
||||
"this" |
|
||||
"throw" |
|
||||
"trait" |
|
||||
"try" |
|
||||
"true" |
|
||||
"type" |
|
||||
"val" |
|
||||
"var" |
|
||||
"while" |
|
||||
"with" |
|
||||
"yield" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
|
||||
{Id} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
{Whitespace} { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* String/Character literals. */
|
||||
\"\"\" { start = zzMarkedPos-3; yybegin(MULTILINE_STRING_DOUBLE); }
|
||||
{UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
|
||||
{CharLiteral} { addToken(Token.LITERAL_CHAR); }
|
||||
{UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
{StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
{UnclosedBacktickLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
{BacktickLiteral} { addToken(Token.LITERAL_BACKQUOTE); }
|
||||
|
||||
/* Comment literals. */
|
||||
{MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
|
||||
{LineCommentBegin} { start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
|
||||
|
||||
{Separator} { addToken(Token.SEPARATOR); }
|
||||
|
||||
{IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
|
||||
{FloatingPointLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters. */
|
||||
. { addToken(Token.IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
<MULTILINE_STRING_DOUBLE> {
|
||||
[^\"\\\n]* {}
|
||||
\\.? { /* Skip escaped chars, handles case: '\"""'. */ }
|
||||
\"\"\" { addToken(start,zzStartRead+2, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(YYINITIAL); }
|
||||
\" {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
|
||||
}
|
||||
|
||||
<MLC> {
|
||||
[^hwf\n\*]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
{MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
|
||||
\* {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
|
||||
}
|
||||
|
||||
<EOL_COMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n |
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
}
|
||||
@@ -1,866 +0,0 @@
|
||||
/* The following code was generated by JFlex 1.4.1 on 11/10/12 10:31 PM */
|
||||
/*
|
||||
* 8/19/2009
|
||||
* ScalaTokenMaker.java - Scanner for the Scala programming language.
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.AbstractJFlexCTokenMaker;
|
||||
import org.fife.ui.rsyntaxtextarea.Token;
|
||||
import org.fife.ui.rsyntaxtextarea.TokenImpl;
|
||||
|
||||
/**
|
||||
* Scanner for the Scala programming language.
|
||||
* <p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost completely
|
||||
* removed to be competitive with the handwritten lexers (subclasses of
|
||||
* <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around). We can
|
||||
* achieve this because RText always scans exactly 1 line of tokens at a time,
|
||||
* and hands the scanner this line as an array of characters (a Segment really).
|
||||
* Since tokens contain pointers to char arrays instead of Strings holding their
|
||||
* contents, there is no need for allocating new memory for Strings.
|
||||
* <p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.
|
||||
* <p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>ScalaTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>. You
|
||||
* should hand-delete the second of each definition (the ones generated by the
|
||||
* lexer), as these generated methods modify the input buffer, which we'll never
|
||||
* have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT be
|
||||
* initialized. This is a needless memory allocation for us since we will be
|
||||
* pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would with
|
||||
* any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
public class ScalaTokenMaker extends AbstractJFlexCTokenMaker {
|
||||
|
||||
/** This character denotes the end of file */
|
||||
public static final int YYEOF = -1;
|
||||
/** lexical states */
|
||||
public static final int EOL_COMMENT = 3;
|
||||
public static final int MULTILINE_STRING_DOUBLE = 1;
|
||||
public static final int YYINITIAL = 0;
|
||||
public static final int MLC = 2;
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final String ZZ_CMAP_PACKED = "\11\0\1\31\1\24\1\0\1\31\23\0\1\31\1\33\1\25\1\33"
|
||||
+ "\1\1\1\33\1\33\1\22\2\4\1\30\1\16\1\33\1\16\1\21" + "\1\27\1\12\11\3\1\42\1\33\1\0\1\33\1\0\2\33\3\10"
|
||||
+ "\1\17\1\14\1\17\5\1\1\6\6\1\1\52\7\1\1\4\1\23" + "\1\4\1\0\1\5\1\26\1\44\1\45\1\11\1\20\1\15\1\40"
|
||||
+ "\1\61\1\34\1\41\1\56\1\60\1\7\1\53\1\50\1\47\1\36" + "\1\2\1\46\1\37\1\35\1\55\1\57\1\43\1\13\1\51\1\54"
|
||||
+ "\1\32\1\0\1\32\1\33\uff81\0";
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
|
||||
/**
|
||||
* Translates DFA states to action switch labels.
|
||||
*/
|
||||
private static final int[] ZZ_ACTION = zzUnpackAction();
|
||||
private static final String ZZ_ACTION_PACKED_0 = "\1\0\1\1\2\0\2\2\1\3\1\4\2\2\1\3"
|
||||
+ "\3\2\1\5\1\6\1\7\2\2\1\10\15\2\1\1" + "\1\11\1\12\2\1\1\13\5\1\1\14\3\1\1\2"
|
||||
+ "\1\3\1\0\2\15\3\2\1\0\3\2\1\16\1\17" + "\1\5\2\7\1\20\1\7\1\21\1\22\26\2\1\11"
|
||||
+ "\1\0\1\23\10\0\1\2\1\15\1\0\4\2\1\24" + "\1\2\1\20\1\25\1\26\11\2\1\16\12\2\1\27"
|
||||
+ "\10\0\21\2\2\0\1\30\2\0\1\31\4\2\1\16" + "\6\2\4\0\3\2";
|
||||
|
||||
private static int[] zzUnpackAction() {
|
||||
int[] result = new int[184];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAction(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a state to a row index in the transition table
|
||||
*/
|
||||
private static final int[] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\62\0\144\0\226\0\310\0\372\0\u012c\0\310"
|
||||
+ "\0\u015e\0\u0190\0\u01c2\0\u01f4\0\u0226\0\u0258\0\u028a\0\310"
|
||||
+ "\0\u02bc\0\u02ee\0\u0320\0\u0352\0\u0384\0\u03b6\0\u03e8\0\u041a"
|
||||
+ "\0\u044c\0\u047e\0\u04b0\0\u04e2\0\u0514\0\u0546\0\u0578\0\u05aa"
|
||||
+ "\0\u05dc\0\u060e\0\u0640\0\310\0\u0672\0\u06a4\0\310\0\u06d6"
|
||||
+ "\0\u0708\0\u073a\0\u076c\0\u079e\0\310\0\u07d0\0\u0802\0\u0834"
|
||||
+ "\0\u0866\0\310\0\u0898\0\310\0\u08ca\0\u08fc\0\u092e\0\u0960"
|
||||
+ "\0\u0992\0\u09c4\0\u09f6\0\u0a28\0\372\0\310\0\u0a5a\0\u0a8c"
|
||||
+ "\0\u0abe\0\u0af0\0\u0b22\0\310\0\310\0\u0b54\0\u0b86\0\u0bb8"
|
||||
+ "\0\u0bea\0\u0c1c\0\u0c4e\0\u0c80\0\u0cb2\0\u0ce4\0\u0d16\0\u0d48"
|
||||
+ "\0\u0d7a\0\u0dac\0\u0dde\0\u0e10\0\u0e42\0\u0e74\0\u0ea6\0\u0ed8"
|
||||
+ "\0\u0f0a\0\u0f3c\0\u0f6e\0\310\0\u0fa0\0\310\0\u0fd2\0\u1004"
|
||||
+ "\0\u1036\0\u1068\0\u109a\0\u10cc\0\u10fe\0\u1130\0\u1162\0\u1194"
|
||||
+ "\0\u11c6\0\u11f8\0\u122a\0\u125c\0\u128e\0\u0992\0\u12c0\0\310"
|
||||
+ "\0\310\0\310\0\u12f2\0\u1324\0\u1356\0\u1388\0\u13ba\0\u13ec"
|
||||
+ "\0\u141e\0\u1450\0\u1482\0\u14b4\0\u14e6\0\u1518\0\u154a\0\u157c"
|
||||
+ "\0\u15ae\0\u15e0\0\u1612\0\u1644\0\u1676\0\u16a8\0\310\0\u16da"
|
||||
+ "\0\u170c\0\u173e\0\u1770\0\u17a2\0\u17d4\0\u1806\0\u1838\0\u186a"
|
||||
+ "\0\u189c\0\u18ce\0\u1900\0\u1932\0\u1964\0\u1996\0\u19c8\0\u19fa"
|
||||
+ "\0\u1a2c\0\u1a5e\0\u1a90\0\u1ac2\0\u1af4\0\u1b26\0\u1b58\0\u1b8a"
|
||||
+ "\0\u1bbc\0\u1bee\0\u1c20\0\u1c52\0\u1c84\0\u1cb6\0\u1ce8\0\u1d1a"
|
||||
+ "\0\u1d4c\0\u1d7e\0\u1db0\0\u1de2\0\u1e14\0\u1e46\0\u1e78\0\u1eaa"
|
||||
+ "\0\u1edc\0\u1f0e\0\u1c20\0\u1f40\0\u1cb6\0\u1f72\0\u1fa4\0\u1fd6";
|
||||
|
||||
private static int[] zzUnpackRowMap() {
|
||||
int[] result = new int[184];
|
||||
int offset = 0;
|
||||
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackRowMap(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int high = packed.charAt(i++) << 16;
|
||||
result[j++] = high | packed.charAt(i++);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* The transition table of the DFA
|
||||
*/
|
||||
private static final int[] ZZ_TRANS = zzUnpackTrans();
|
||||
private static final String ZZ_TRANS_PACKED_0 = "\1\5\2\6\1\7\1\10\2\6\1\11\1\6\1\12"
|
||||
+ "\1\13\2\6\1\14\1\5\1\6\1\15\1\16\1\17" + "\1\5\1\20\1\21\1\22\1\23\1\5\1\24\1\10"
|
||||
+ "\1\5\1\6\1\25\1\26\1\27\1\30\1\31\1\5" + "\1\32\1\33\1\6\1\34\1\35\1\36\1\37\1\6"
|
||||
+ "\1\40\3\6\1\41\2\6\23\42\1\43\1\44\1\45" + "\34\42\24\46\1\47\3\46\1\50\3\46\1\51\3\46"
|
||||
+ "\1\52\2\46\1\53\16\46\24\54\1\55\7\54\1\56" + "\3\54\1\57\2\54\1\60\16\54\63\0\3\6\1\0"
|
||||
+ "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\17\6" + "\3\0\1\7\2\0\2\62\2\0\1\7\1\0\2\63"
|
||||
+ "\1\0\2\64\1\65\16\0\1\64\22\0\3\6\1\0" + "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\1\6"
|
||||
+ "\1\66\15\6\1\0\3\6\1\0\1\61\1\6\1\67" + "\6\6\1\0\2\6\13\0\6\6\1\0\1\6\1\70"
|
||||
+ "\15\6\3\0\1\7\2\0\2\62\2\0\1\7\1\71" + "\2\63\1\0\2\64\1\65\16\0\1\64\22\0\3\6"
|
||||
+ "\1\0\1\61\1\6\1\72\3\6\1\73\2\6\1\0" + "\2\6\13\0\6\6\1\0\17\6\1\0\3\6\1\0"
|
||||
+ "\1\61\7\6\1\74\1\0\2\6\13\0\6\6\1\0" + "\4\6\1\75\12\6\3\0\1\65\6\0\1\65\47\0"
|
||||
+ "\22\17\1\76\1\77\36\17\23\100\1\101\1\100\1\102" + "\34\100\26\103\1\0\33\103\27\0\1\104\1\105\62\0"
|
||||
+ "\1\24\31\0\3\6\1\0\1\61\10\6\1\0\2\6" + "\13\0\1\106\5\6\1\0\3\6\1\107\2\6\1\110"
|
||||
+ "\10\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6" + "\13\0\6\6\1\0\1\6\1\111\1\6\1\112\13\6"
|
||||
+ "\1\0\3\6\1\0\1\61\7\6\1\113\1\0\2\6" + "\13\0\6\6\1\0\12\6\1\114\4\6\1\0\3\6"
|
||||
+ "\1\0\1\61\10\6\1\0\2\6\13\0\5\6\1\115" + "\1\0\1\6\1\116\2\6\1\117\12\6\1\0\3\6"
|
||||
+ "\1\0\1\61\10\6\1\0\2\6\13\0\4\6\1\75" + "\1\6\1\0\10\6\1\120\6\6\1\0\3\6\1\0"
|
||||
+ "\1\61\10\6\1\0\2\6\13\0\1\121\4\6\1\122" + "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0"
|
||||
+ "\2\6\13\0\6\6\1\0\2\6\1\123\14\6\1\0" + "\3\6\1\0\1\61\7\6\1\124\1\0\2\6\13\0"
|
||||
+ "\6\6\1\0\17\6\1\0\3\6\1\0\1\61\10\6" + "\1\0\2\6\13\0\6\6\1\0\2\6\1\125\11\6"
|
||||
+ "\1\126\2\6\1\0\3\6\1\0\1\61\7\6\1\127" + "\1\0\2\6\13\0\6\6\1\0\12\6\1\130\4\6"
|
||||
+ "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0" + "\5\6\1\131\1\0\17\6\1\0\3\6\1\0\1\61"
|
||||
+ "\10\6\1\0\2\6\13\0\6\6\1\0\1\6\1\132" + "\15\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"
|
||||
+ "\13\0\6\6\1\0\1\6\1\133\15\6\23\42\3\0" + "\34\42\24\134\1\0\35\134\25\0\1\135\34\0\24\46"
|
||||
+ "\1\0\3\46\1\0\3\46\1\0\3\46\1\0\2\46" + "\1\0\16\46\27\0\1\136\67\0\1\137\61\0\1\140"
|
||||
+ "\3\0\1\141\63\0\1\142\16\0\24\54\1\0\7\54" + "\1\0\3\54\1\0\2\54\1\0\16\54\35\0\1\143"
|
||||
+ "\61\0\1\144\3\0\1\145\63\0\1\146\16\0\1\147" + "\3\6\1\0\1\61\10\6\1\147\2\6\1\0\7\147"
|
||||
+ "\1\0\2\147\6\6\1\147\17\6\3\0\1\150\6\0" + "\1\150\3\0\1\151\46\0\1\65\6\0\1\65\1\0"
|
||||
+ "\2\63\1\0\2\64\17\0\1\64\22\0\3\6\1\0" + "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\11\6"
|
||||
+ "\1\152\5\6\1\0\3\6\1\0\1\61\10\6\1\0" + "\2\6\13\0\6\6\1\0\1\6\1\153\15\6\1\0"
|
||||
+ "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\1\6" + "\1\154\1\6\1\155\2\6\1\0\17\6\3\0\1\156"
|
||||
+ "\4\0\3\156\1\0\2\156\1\0\2\156\17\0\1\156" + "\3\0\2\156\15\0\3\6\1\0\1\61\10\6\1\0"
|
||||
+ "\2\6\13\0\3\6\1\155\2\6\1\0\17\6\1\0" + "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\1\6"
|
||||
+ "\1\157\4\6\1\0\17\6\1\0\3\6\1\0\1\61" + "\10\6\1\0\2\6\13\0\4\6\1\75\1\6\1\0"
|
||||
+ "\17\6\24\17\1\0\35\17\23\100\1\101\1\100\1\160" + "\60\100\1\0\35\100\25\0\1\161\34\0\26\103\1\162"
|
||||
+ "\33\103\1\0\3\6\1\0\1\61\10\6\1\0\2\6" + "\13\0\5\6\1\163\1\0\3\6\1\164\13\6\1\0"
|
||||
+ "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\6\6" + "\1\0\1\6\1\165\4\6\1\75\3\6\1\155\4\6"
|
||||
+ "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0" + "\2\6\1\155\3\6\1\0\17\6\1\0\3\6\1\0"
|
||||
+ "\1\61\3\6\1\166\4\6\1\0\2\6\13\0\6\6" + "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0"
|
||||
+ "\2\6\13\0\5\6\1\167\1\0\4\6\1\170\12\6" + "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"
|
||||
+ "\6\6\1\0\1\6\1\171\15\6\1\0\3\6\1\0" + "\1\61\10\6\1\0\2\6\13\0\2\6\1\172\3\6"
|
||||
+ "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0" + "\2\6\13\0\6\6\1\0\5\6\1\173\11\6\1\0"
|
||||
+ "\3\6\1\0\1\61\1\6\1\72\6\6\1\0\2\6" + "\13\0\6\6\1\0\17\6\1\0\3\6\1\0\1\61"
|
||||
+ "\10\6\1\0\2\6\13\0\6\6\1\0\3\6\1\174" + "\13\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"
|
||||
+ "\13\0\2\6\1\175\3\6\1\0\17\6\1\0\3\6" + "\1\0\1\61\10\6\1\0\2\6\13\0\5\6\1\176"
|
||||
+ "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0" + "\2\6\13\0\1\6\1\177\4\6\1\0\17\6\1\0"
|
||||
+ "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\3\6" + "\1\200\2\6\1\0\17\6\1\0\1\6\1\201\1\6"
|
||||
+ "\1\0\1\61\10\6\1\0\2\6\13\0\1\6\1\202" + "\4\6\1\0\17\6\1\0\3\6\1\0\1\61\10\6"
|
||||
+ "\1\0\2\6\13\0\6\6\1\0\13\6\1\203\3\6" + "\1\0\3\6\1\0\1\61\7\6\1\204\1\0\2\6"
|
||||
+ "\13\0\6\6\1\0\17\6\1\0\3\6\1\0\1\61" + "\10\6\1\0\2\6\13\0\6\6\1\0\1\75\16\6"
|
||||
+ "\1\0\3\6\1\0\1\61\1\6\1\205\6\6\1\0" + "\2\6\13\0\6\6\1\0\17\6\1\0\3\6\1\0"
|
||||
+ "\1\61\7\6\1\206\1\0\2\6\13\0\6\6\1\0" + "\17\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"
|
||||
+ "\13\0\1\6\1\154\4\6\1\0\17\6\1\0\3\6" + "\1\0\1\61\1\6\1\75\6\6\1\0\2\6\13\0"
|
||||
+ "\6\6\1\0\3\6\1\75\13\6\25\0\1\207\71\0" + "\1\210\62\0\1\211\32\0\1\212\115\0\1\213\53\0"
|
||||
+ "\1\214\62\0\1\215\32\0\1\216\115\0\1\217\16\0" + "\1\147\15\0\1\147\3\0\7\147\1\0\2\147\6\0"
|
||||
+ "\1\147\22\0\1\150\6\0\1\150\4\0\2\64\17\0" + "\1\64\24\0\1\150\6\0\1\150\50\0\3\6\1\0"
|
||||
+ "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\6\6" + "\1\75\10\6\1\0\3\6\1\0\1\61\10\6\1\0"
|
||||
+ "\2\6\13\0\3\6\1\163\2\6\1\0\17\6\1\0" + "\3\6\1\0\1\61\3\6\1\177\4\6\1\0\2\6"
|
||||
+ "\13\0\6\6\1\0\17\6\1\0\3\6\1\0\1\61" + "\7\6\1\75\1\0\2\6\13\0\6\6\1\0\17\6"
|
||||
+ "\1\0\3\6\1\0\1\61\7\6\1\220\1\0\2\6" + "\13\0\6\6\1\0\17\6\1\0\3\6\1\0\1\61"
|
||||
+ "\10\6\1\0\2\6\13\0\3\6\1\75\2\6\1\0" + "\17\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"
|
||||
+ "\13\0\6\6\1\0\4\6\1\127\12\6\1\0\3\6" + "\1\0\1\61\10\6\1\0\2\6\13\0\5\6\1\221"
|
||||
+ "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0" + "\2\6\13\0\6\6\1\0\15\6\1\222\1\6\1\0"
|
||||
+ "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\6\6" + "\1\0\14\6\1\223\2\6\1\0\3\6\1\0\1\61"
|
||||
+ "\10\6\1\0\2\6\13\0\1\6\1\224\4\6\1\0" + "\17\6\1\0\3\6\1\0\1\61\1\6\1\225\6\6"
|
||||
+ "\1\0\2\6\13\0\6\6\1\0\17\6\1\0\3\6" + "\1\0\1\61\7\6\1\226\1\0\2\6\13\0\6\6"
|
||||
+ "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0" + "\2\6\13\0\6\6\1\0\1\6\1\227\15\6\1\0"
|
||||
+ "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\6\6" + "\1\0\7\6\1\230\7\6\1\0\3\6\1\0\1\61"
|
||||
+ "\1\6\1\231\6\6\1\0\2\6\13\0\6\6\1\0" + "\4\6\1\232\12\6\1\0\3\6\1\0\1\61\1\6"
|
||||
+ "\1\155\6\6\1\0\2\6\13\0\6\6\1\0\17\6" + "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"
|
||||
+ "\1\75\5\6\1\0\17\6\1\0\3\6\1\0\1\61" + "\10\6\1\0\2\6\13\0\1\6\1\233\4\6\1\0"
|
||||
+ "\17\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6" + "\13\0\6\6\1\0\12\6\1\234\4\6\1\0\3\6"
|
||||
+ "\1\0\1\61\10\6\1\0\2\6\13\0\6\6\1\0" + "\12\6\1\235\4\6\1\0\3\6\1\0\1\61\7\6"
|
||||
+ "\1\236\1\0\2\6\13\0\6\6\1\0\17\6\1\0" + "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\6\6"
|
||||
+ "\1\0\3\6\1\237\13\6\1\0\3\6\1\0\1\61" + "\1\6\1\75\6\6\1\0\2\6\13\0\6\6\1\0"
|
||||
+ "\17\6\1\0\3\6\1\0\1\61\1\6\1\240\6\6" + "\1\0\2\6\13\0\6\6\1\0\17\6\36\0\1\241"
|
||||
+ "\65\0\1\242\34\0\1\211\65\0\1\243\76\0\1\244" + "\65\0\1\245\34\0\1\215\65\0\1\246\41\0\3\6"
|
||||
+ "\1\0\1\61\10\6\1\0\2\6\13\0\6\6\1\0" + "\5\6\1\247\11\6\1\0\3\6\1\0\1\61\10\6"
|
||||
+ "\1\0\2\6\13\0\1\6\1\75\4\6\1\0\17\6" + "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"
|
||||
+ "\6\6\1\0\1\6\1\250\15\6\1\0\3\6\1\0" + "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\1\6"
|
||||
+ "\1\251\15\6\1\0\3\6\1\0\1\61\7\6\1\252" + "\1\0\2\6\13\0\6\6\1\0\17\6\1\0\3\6"
|
||||
+ "\1\0\1\61\7\6\1\240\1\0\2\6\13\0\6\6" + "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0"
|
||||
+ "\2\6\13\0\6\6\1\0\3\6\1\75\13\6\1\0" + "\3\6\1\0\1\61\1\6\1\253\6\6\1\0\2\6"
|
||||
+ "\13\0\6\6\1\0\17\6\1\0\3\6\1\0\1\61" + "\10\6\1\0\2\6\13\0\6\6\1\0\4\6\1\254"
|
||||
+ "\12\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6" + "\13\0\5\6\1\255\1\0\17\6\1\0\3\6\1\0"
|
||||
+ "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\3\6" + "\1\221\13\6\1\0\3\6\1\0\1\61\10\6\1\0"
|
||||
+ "\2\6\13\0\6\6\1\0\3\6\1\256\13\6\1\0" + "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\5\6"
|
||||
+ "\1\257\1\0\17\6\1\0\3\6\1\0\1\61\10\6" + "\1\0\2\6\13\0\6\6\1\0\3\6\1\260\13\6"
|
||||
+ "\1\0\3\6\1\0\1\61\3\6\1\221\4\6\1\0" + "\2\6\13\0\6\6\1\0\17\6\1\0\3\6\1\0"
|
||||
+ "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\3\6" + "\1\261\13\6\1\0\3\6\1\0\1\61\10\6\1\0"
|
||||
+ "\1\6\1\75\13\0\6\6\1\0\17\6\37\0\1\211" + "\2\0\1\242\46\0\1\262\33\0\3\243\1\263\11\243"
|
||||
+ "\1\263\2\243\2\263\4\0\1\243\1\263\2\0\1\263" + "\6\243\1\263\17\243\37\0\1\215\2\0\1\245\46\0"
|
||||
+ "\1\264\33\0\3\246\1\265\11\246\1\265\2\246\2\265" + "\4\0\1\246\1\265\2\0\1\265\6\246\1\265\17\246"
|
||||
+ "\1\0\3\6\1\0\1\61\10\6\1\0\1\6\1\163" + "\13\0\6\6\1\0\17\6\1\0\3\6\1\0\1\61"
|
||||
+ "\10\6\1\0\2\6\13\0\6\6\1\0\16\6\1\155" + "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"
|
||||
+ "\1\6\1\155\4\6\1\0\17\6\1\0\3\6\1\0" + "\1\61\3\6\1\266\4\6\1\0\2\6\13\0\6\6"
|
||||
+ "\1\0\17\6\1\0\3\6\1\0\1\61\1\6\1\152" + "\6\6\1\0\2\6\13\0\6\6\1\0\17\6\1\0"
|
||||
+ "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\6\6" + "\1\0\10\6\1\155\6\6\1\0\3\6\1\0\1\61"
|
||||
+ "\3\6\1\165\4\6\1\0\2\6\13\0\6\6\1\0" + "\17\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"
|
||||
+ "\13\0\6\6\1\0\1\6\1\236\15\6\1\0\3\6" + "\1\0\1\61\10\6\1\0\2\6\13\0\6\6\1\0"
|
||||
+ "\3\6\1\267\13\6\1\0\3\6\1\0\1\61\10\6" + "\1\0\2\6\13\0\6\6\1\0\5\6\1\75\11\6"
|
||||
+ "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0" + "\5\6\1\270\1\0\17\6\27\0\1\243\61\0\1\246"
|
||||
+ "\33\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0" + "\1\6\1\225\4\6\1\0\17\6\1\0\3\6\1\0"
|
||||
+ "\1\61\7\6\1\163\1\0\2\6\13\0\6\6\1\0" + "\17\6\1\0\3\6\1\0\1\61\10\6\1\0\1\6"
|
||||
+ "\1\155\13\0\6\6\1\0\17\6";
|
||||
|
||||
private static int[] zzUnpackTrans() {
|
||||
int[] result = new int[8200];
|
||||
int offset = 0;
|
||||
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackTrans(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
value--;
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/* error codes */
|
||||
private static final int ZZ_UNKNOWN_ERROR = 0;
|
||||
private static final int ZZ_NO_MATCH = 1;
|
||||
private static final int ZZ_PUSHBACK_2BIG = 2;
|
||||
/* error messages for the codes above */
|
||||
private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input",
|
||||
"Error: pushback value was too large" };
|
||||
/**
|
||||
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
|
||||
*/
|
||||
private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 = "\1\0\1\1\2\0\1\11\2\1\1\11\7\1\1\11"
|
||||
+ "\23\1\1\11\2\1\1\11\5\1\1\11\4\1\1\11" + "\1\0\1\11\4\1\1\0\4\1\1\11\5\1\2\11"
|
||||
+ "\26\1\1\11\1\0\1\11\10\0\2\1\1\0\6\1" + "\3\11\24\1\1\11\10\0\21\1\2\0\1\1\2\0" + "\14\1\4\0\3\1";
|
||||
|
||||
private static int[] zzUnpackAttribute() {
|
||||
int[] result = new int[184];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAttribute(String packed, int offset, int[] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do
|
||||
result[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/** the input device */
|
||||
private java.io.Reader zzReader;
|
||||
/** the current state of the DFA */
|
||||
private int zzState;
|
||||
/** the current lexical state */
|
||||
private int zzLexicalState = YYINITIAL;
|
||||
/**
|
||||
* this buffer contains the current text to be matched and is the source of the
|
||||
* yytext() string
|
||||
*/
|
||||
private char zzBuffer[];
|
||||
/** the textposition at the last accepting state */
|
||||
private int zzMarkedPos;
|
||||
/** the current text position in the buffer */
|
||||
private int zzCurrentPos;
|
||||
/** startRead marks the beginning of the yytext() string in the buffer */
|
||||
private int zzStartRead;
|
||||
/**
|
||||
* endRead marks the last character in the buffer, that has been read from input
|
||||
*/
|
||||
private int zzEndRead;
|
||||
/** zzAtEOF == true <=> the scanner is at the EOF */
|
||||
private boolean zzAtEOF;
|
||||
/* user code: */
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a no-parameter
|
||||
* constructor.
|
||||
*/
|
||||
public ScalaTokenMaker() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos - 1, tokenType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addHyperlinkToken(int, int, int)
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start, end, tokenType, so, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token occurs.
|
||||
* @param hyperlink Whether this token is a hyperlink.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset, boolean hyperlink) {
|
||||
super.addToken(array, start, end, tokenType, startOffset, hyperlink);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "//", null };
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated from
|
||||
* <code>text</code>. This method must be implemented by subclasses so they can
|
||||
* correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing the syntax
|
||||
* highlighted text.
|
||||
*/
|
||||
@Override
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
// Start off in the proper state.
|
||||
int state = YYINITIAL;
|
||||
switch (initialTokenType) {
|
||||
case Token.LITERAL_STRING_DOUBLE_QUOTE:
|
||||
state = MULTILINE_STRING_DOUBLE;
|
||||
break;
|
||||
case Token.COMMENT_MULTILINE:
|
||||
state = MLC;
|
||||
break;
|
||||
default:
|
||||
state = YYINITIAL;
|
||||
}
|
||||
s = text;
|
||||
start = text.offset;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos >= s.offset + s.count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream. Does not close the old
|
||||
* reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream <b>cannot</b> be
|
||||
* reused (internal buffer is discarded and lost). Lexical state is set to
|
||||
* <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill no longer
|
||||
* "refills" the buffer (since the way we do it, it's always "full" the first
|
||||
* time through, since it points to the segment's array). So, we assign
|
||||
* zzEndRead here.
|
||||
*/
|
||||
// zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner There is also a java.io.InputStream version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
public ScalaTokenMaker(java.io.Reader in) {
|
||||
this.zzReader = in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner. There is also java.io.Reader version of this
|
||||
* constructor.
|
||||
*
|
||||
* @param in the java.io.Inputstream to read input from.
|
||||
*/
|
||||
public ScalaTokenMaker(java.io.InputStream in) {
|
||||
this(new java.io.InputStreamReader(in));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unpacks the compressed character translation table.
|
||||
*
|
||||
* @param packed the packed character translation table
|
||||
* @return the unpacked character translation table
|
||||
*/
|
||||
private static char[] zzUnpackCMap(String packed) {
|
||||
char[] map = new char[0x10000];
|
||||
int i = 0; /* index in packed string */
|
||||
int j = 0; /* index in unpacked array */
|
||||
while (i < 150) {
|
||||
int count = packed.charAt(i++);
|
||||
char value = packed.charAt(i++);
|
||||
do
|
||||
map[j++] = value;
|
||||
while (--count > 0);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the input stream.
|
||||
*/
|
||||
public final void yyclose() throws java.io.IOException {
|
||||
zzAtEOF = true; /* indicate end of file */
|
||||
zzEndRead = zzStartRead; /* invalidate buffer */
|
||||
if (zzReader != null)
|
||||
zzReader.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current lexical state.
|
||||
*/
|
||||
public final int yystate() {
|
||||
return zzLexicalState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enters a new lexical state
|
||||
*
|
||||
* @param newState the new lexical state
|
||||
*/
|
||||
@Override
|
||||
public final void yybegin(int newState) {
|
||||
zzLexicalState = newState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the text matched by the current regular expression.
|
||||
*/
|
||||
public final String yytext() {
|
||||
return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character at position <tt>pos</tt> from the matched text.
|
||||
*
|
||||
* It is equivalent to yytext().charAt(pos), but faster
|
||||
*
|
||||
* @param pos the position of the character to fetch. A value from 0 to
|
||||
* yylength()-1.
|
||||
*
|
||||
* @return the character at position pos
|
||||
*/
|
||||
public final char yycharat(int pos) {
|
||||
return zzBuffer[zzStartRead + pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the length of the matched text region.
|
||||
*/
|
||||
public final int yylength() {
|
||||
return zzMarkedPos - zzStartRead;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports an error that occured while scanning.
|
||||
*
|
||||
* In a wellformed scanner (no or only correct usage of yypushback(int) and a
|
||||
* match-all fallback rule) this method will only be called with things that
|
||||
* "Can't Possibly Happen". If this method is called, something is seriously
|
||||
* wrong (e.g. a JFlex bug producing a faulty scanner etc.).
|
||||
*
|
||||
* Usual syntax/scanner level error handling should be done in error fallback
|
||||
* rules.
|
||||
*
|
||||
* @param errorCode the code of the errormessage to display
|
||||
*/
|
||||
private void zzScanError(int errorCode) {
|
||||
String message;
|
||||
try {
|
||||
message = ZZ_ERROR_MSG[errorCode];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
|
||||
}
|
||||
throw new Error(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes the specified amount of characters back into the input stream.
|
||||
*
|
||||
* They will be read again by then next call of the scanning method
|
||||
*
|
||||
* @param number the number of characters to be read again. This number must not
|
||||
* be greater than yylength()!
|
||||
*/
|
||||
public void yypushback(int number) {
|
||||
if (number > yylength())
|
||||
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||
zzMarkedPos -= number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resumes scanning until the next regular expression is matched, the end of
|
||||
* input is encountered or an I/O-Error occurs.
|
||||
*
|
||||
* @return the next token
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
|
||||
int zzInput;
|
||||
int zzAction;
|
||||
// cached fields:
|
||||
int zzCurrentPosL;
|
||||
int zzMarkedPosL;
|
||||
int zzEndReadL = zzEndRead;
|
||||
char[] zzBufferL = zzBuffer;
|
||||
char[] zzCMapL = ZZ_CMAP;
|
||||
int[] zzTransL = ZZ_TRANS;
|
||||
int[] zzRowMapL = ZZ_ROWMAP;
|
||||
int[] zzAttrL = ZZ_ATTRIBUTE;
|
||||
while (true) {
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzAction = -1;
|
||||
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
|
||||
zzState = zzLexicalState;
|
||||
zzForAction: {
|
||||
while (true) {
|
||||
if (zzCurrentPosL < zzEndReadL)
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
else if (zzAtEOF) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
// store back cached positions
|
||||
zzCurrentPos = zzCurrentPosL;
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
boolean eof = zzRefill();
|
||||
// get translated positions and possibly new buffer
|
||||
zzCurrentPosL = zzCurrentPos;
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzBufferL = zzBuffer;
|
||||
zzEndReadL = zzEndRead;
|
||||
if (eof) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
}
|
||||
}
|
||||
int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
|
||||
if (zzNext == -1)
|
||||
break zzForAction;
|
||||
zzState = zzNext;
|
||||
int zzAttributes = zzAttrL[zzState];
|
||||
if ((zzAttributes & 1) == 1) {
|
||||
zzAction = zzState;
|
||||
zzMarkedPosL = zzCurrentPosL;
|
||||
if ((zzAttributes & 8) == 8)
|
||||
break zzForAction;
|
||||
}
|
||||
}
|
||||
}
|
||||
// store back cached position
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||
case 6: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 26:
|
||||
break;
|
||||
case 15: {
|
||||
addToken(Token.LITERAL_CHAR);
|
||||
}
|
||||
case 27:
|
||||
break;
|
||||
case 21: {
|
||||
start = zzMarkedPos - 3;
|
||||
yybegin(MULTILINE_STRING_DOUBLE);
|
||||
}
|
||||
case 28:
|
||||
break;
|
||||
case 19: {
|
||||
yybegin(YYINITIAL);
|
||||
addToken(start, zzStartRead + 1, Token.COMMENT_MULTILINE);
|
||||
}
|
||||
case 29:
|
||||
break;
|
||||
case 18: {
|
||||
start = zzMarkedPos - 2;
|
||||
yybegin(MLC);
|
||||
}
|
||||
case 30:
|
||||
break;
|
||||
case 8: {
|
||||
addToken(Token.WHITESPACE);
|
||||
}
|
||||
case 31:
|
||||
break;
|
||||
case 20: {
|
||||
addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
|
||||
}
|
||||
case 32:
|
||||
break;
|
||||
case 13: {
|
||||
addToken(Token.LITERAL_NUMBER_FLOAT);
|
||||
}
|
||||
case 33:
|
||||
break;
|
||||
case 14: {
|
||||
addToken(Token.RESERVED_WORD);
|
||||
}
|
||||
case 34:
|
||||
break;
|
||||
case 4: {
|
||||
addToken(Token.SEPARATOR);
|
||||
}
|
||||
case 35:
|
||||
break;
|
||||
case 22: {
|
||||
addToken(Token.LITERAL_BACKQUOTE);
|
||||
}
|
||||
case 36:
|
||||
break;
|
||||
case 9: { /* Skip escaped chars, handles case: '\"""'. */
|
||||
}
|
||||
case 37:
|
||||
break;
|
||||
case 2: {
|
||||
addToken(Token.IDENTIFIER);
|
||||
}
|
||||
case 38:
|
||||
break;
|
||||
case 12: {
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 39:
|
||||
break;
|
||||
case 17: {
|
||||
start = zzMarkedPos - 2;
|
||||
yybegin(EOL_COMMENT);
|
||||
}
|
||||
case 40:
|
||||
break;
|
||||
case 23: {
|
||||
addToken(start, zzStartRead + 2, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
yybegin(YYINITIAL);
|
||||
}
|
||||
case 41:
|
||||
break;
|
||||
case 5: {
|
||||
addToken(Token.ERROR_CHAR);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 42:
|
||||
break;
|
||||
case 7: {
|
||||
addToken(Token.ERROR_STRING_DOUBLE);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 43:
|
||||
break;
|
||||
case 16: {
|
||||
addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
}
|
||||
case 44:
|
||||
break;
|
||||
case 10: {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
return firstToken;
|
||||
}
|
||||
case 45:
|
||||
break;
|
||||
case 25: {
|
||||
int temp = zzStartRead;
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
|
||||
addHyperlinkToken(temp, zzMarkedPos - 1, Token.COMMENT_EOL);
|
||||
start = zzMarkedPos;
|
||||
}
|
||||
case 46:
|
||||
break;
|
||||
case 24: {
|
||||
int temp = zzStartRead;
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_MULTILINE);
|
||||
addHyperlinkToken(temp, zzMarkedPos - 1, Token.COMMENT_MULTILINE);
|
||||
start = zzMarkedPos;
|
||||
}
|
||||
case 47:
|
||||
break;
|
||||
case 3: {
|
||||
addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
|
||||
}
|
||||
case 48:
|
||||
break;
|
||||
case 1: {
|
||||
}
|
||||
case 49:
|
||||
break;
|
||||
case 11: {
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_MULTILINE);
|
||||
return firstToken;
|
||||
}
|
||||
case 50:
|
||||
break;
|
||||
default:
|
||||
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
|
||||
zzAtEOF = true;
|
||||
switch (zzLexicalState) {
|
||||
case EOL_COMMENT: {
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 185:
|
||||
break;
|
||||
case MULTILINE_STRING_DOUBLE: {
|
||||
addToken(start, zzStartRead - 1, Token.LITERAL_STRING_DOUBLE_QUOTE);
|
||||
return firstToken;
|
||||
}
|
||||
case 186:
|
||||
break;
|
||||
case YYINITIAL: {
|
||||
addNullToken();
|
||||
return firstToken;
|
||||
}
|
||||
case 187:
|
||||
break;
|
||||
case MLC: {
|
||||
addToken(start, zzStartRead - 1, Token.COMMENT_MULTILINE);
|
||||
return firstToken;
|
||||
}
|
||||
case 188:
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,401 +0,0 @@
|
||||
/*
|
||||
* 10/03/2007
|
||||
*
|
||||
* TclTokenMaker.java - Scanner for the Tcl programming language.
|
||||
*
|
||||
* This library is distributed under a modified BSD license. See the included
|
||||
* RSyntaxTextArea.License.txt file for details.
|
||||
*/
|
||||
package org.fife.ui.rsyntaxtextarea.modes;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* Scanner for the Tcl programming language.<p>
|
||||
*
|
||||
* This implementation was created using
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
|
||||
* was modified for performance. Memory allocation needs to be almost
|
||||
* completely removed to be competitive with the handwritten lexers (subclasses
|
||||
* of <code>AbstractTokenMaker</code>, so this class has been modified so that
|
||||
* Strings are never allocated (via yytext()), and the scanner never has to
|
||||
* worry about refilling its buffer (needlessly copying chars around).
|
||||
* We can achieve this because RText always scans exactly 1 line of tokens at a
|
||||
* time, and hands the scanner this line as an array of characters (a Segment
|
||||
* really). Since tokens contain pointers to char arrays instead of Strings
|
||||
* holding their contents, there is no need for allocating new memory for
|
||||
* Strings.<p>
|
||||
*
|
||||
* The actual algorithm generated for scanning has, of course, not been
|
||||
* modified.<p>
|
||||
*
|
||||
* If you wish to regenerate this file yourself, keep in mind the following:
|
||||
* <ul>
|
||||
* <li>The generated <code>TclTokenMaker.java</code> file will contain two
|
||||
* definitions of both <code>zzRefill</code> and <code>yyreset</code>.
|
||||
* You should hand-delete the second of each definition (the ones
|
||||
* generated by the lexer), as these generated methods modify the input
|
||||
* buffer, which we'll never have to do.</li>
|
||||
* <li>You should also change the declaration/definition of zzBuffer to NOT
|
||||
* be initialized. This is a needless memory allocation for us since we
|
||||
* will be pointing the array somewhere else anyway.</li>
|
||||
* <li>You should NOT call <code>yylex()</code> on the generated scanner
|
||||
* directly; rather, you should use <code>getTokenList</code> as you would
|
||||
* with any other <code>TokenMaker</code> instance.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Robert Futrell
|
||||
* @version 0.5
|
||||
*
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class TclTokenMaker
|
||||
%extends AbstractJFlexCTokenMaker
|
||||
%unicode
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public TclTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
*/
|
||||
@Override
|
||||
public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
|
||||
super.addToken(array, start,end, tokenType, startOffset);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "//", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Letter = [A-Za-z]
|
||||
NonzeroDigit = [1-9]
|
||||
Digit = ("0"|{NonzeroDigit})
|
||||
HexDigit = ({Digit}|[A-Fa-f])
|
||||
OctalDigit = ([0-7])
|
||||
EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
|
||||
NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
|
||||
IdentifierStart = ({Letter}|"_"|"$")
|
||||
IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
|
||||
|
||||
LineTerminator = (\n)
|
||||
WhiteSpace = ([ \t\f])
|
||||
|
||||
UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
|
||||
StringLiteral = ({UnclosedStringLiteral}[\"])
|
||||
|
||||
LineCommentBegin = "#"
|
||||
|
||||
IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
|
||||
IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
|
||||
IntegerLiteral = ({IntegerHelper1}[lL]?)
|
||||
HexLiteral = ({IntegerHelper2}[lL]?)
|
||||
FloatHelper1 = ([fFdD]?)
|
||||
FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
|
||||
FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
|
||||
FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
|
||||
FloatLiteral3 = ({Digit}+{FloatHelper2})
|
||||
FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
|
||||
ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
|
||||
|
||||
Separator = ([\(\)\{\}\[\]])
|
||||
Separator2 = ([\;,.])
|
||||
|
||||
Operator = ("="|"!"|"+"|"-"|"*"|"/"|">"=?|"<"=?|"%"|"&"|"|"|"^"|"~")
|
||||
|
||||
Identifier = ({IdentifierStart}{IdentifierPart}*)
|
||||
ErrorIdentifier = ({NonSeparator}+)
|
||||
|
||||
|
||||
%%
|
||||
|
||||
/* Keywords */
|
||||
<YYINITIAL> "append" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "array" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "auto_mkindex" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "concat" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "console" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "eval" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "expr" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "format" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "global" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "set" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "trace" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "unset" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "upvar" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "join" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "lappend" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "lindex" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "linsert" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "list" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "llength" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "lrange" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "lreplace" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "lsearch" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "lsort" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "split" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "scan" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "string" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "regexp" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "regsub" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "if" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "else" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "elseif" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "switch" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "for" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "foreach" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "while" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "break" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "continue" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "proc" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "return" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "source" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "unkown" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "uplevel" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "cd" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "close" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "eof" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "file" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "flush" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "gets" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "glob" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "open" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "read" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "puts" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "pwd" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "seek" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "tell" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "catch" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "error" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "exec" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "pid" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "after" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "time" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "exit" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "history" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "rename" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "info" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "ceil" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "floor" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "round" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "incr" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "hypot" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "abs" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "acos" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "cos" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "cosh" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "asin" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "sin" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "sinh" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "atan" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "atan2" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "tan" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "tanh" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "log" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "log10" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "fmod" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "pow" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "hypot" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "sqrt" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "double" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "int" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
<YYINITIAL> "bind" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "button" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "canvas" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "checkbutton" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "destroy" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "entry" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "focus" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "frame" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "grab" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "image" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "label" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "listbox" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "lower" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "menu" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "menubutton" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "message" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "option" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "pack" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "placer" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "radiobutton" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "raise" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "scale" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "scrollbar" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "selection" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "send" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "text" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "tk" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "tkerror" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "tkwait" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "toplevel" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "update" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "winfo" { addToken(Token.RESERVED_WORD); }
|
||||
<YYINITIAL> "wm" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
{WhiteSpace}+ { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* String/Character literals. */
|
||||
{StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
{UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
|
||||
/* Comment literals. */
|
||||
{LineCommentBegin}.* { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
|
||||
/* Separators. */
|
||||
{Separator} { addToken(Token.SEPARATOR); }
|
||||
{Separator2} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
/* Operators. */
|
||||
{Operator} { addToken(Token.OPERATOR); }
|
||||
|
||||
/* Numbers */
|
||||
{IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
|
||||
{FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
{ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
|
||||
|
||||
{ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters and flag them as bad. */
|
||||
. { addToken(Token.ERROR_IDENTIFIER); }
|
||||
|
||||
}
|
||||
Loaded 100 of 111 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user