From 2672d3c4c393ca61cbb14a619d253c030780eb00 Mon Sep 17 00:00:00 2001
From: Kenneth Jenkins <51246568+kenjenkins@users.noreply.github.com>
Date: Thu, 23 Mar 2023 11:59:08 -0700
Subject: [PATCH] Add Smali lexer (#765)
Converted from the pygments Smali lexer. Add a basic test case and
update the 'Supported languages' table in the README.
---
README.md | 2 +-
lexers/embedded/smali.xml | 73 ++++++++++
lexers/testdata/smali.actual | 55 +++++++
lexers/testdata/smali.expected | 254 +++++++++++++++++++++++++++++++++
4 files changed, 383 insertions(+), 1 deletion(-)
create mode 100644 lexers/embedded/smali.xml
create mode 100644 lexers/testdata/smali.actual
create mode 100644 lexers/testdata/smali.expected
diff --git a/README.md b/README.md
index 3b05779..39c98e8 100644
--- a/README.md
+++ b/README.md
@@ -55,7 +55,7 @@ O | Objective-C, OCaml, Octave, OnesEnterprise, OpenEdge ABL, OpenSCAD, Org Mode
P | PacmanConf, Perl, PHP, PHTML, Pig, PkgConfig, PL/pgSQL, plaintext, Pony, PostgreSQL SQL dialect, PostScript, POVRay, PowerShell, Prolog, PromQL, Properties, Protocol Buffer, PSL, Puppet, Python 2, Python
Q | QBasic
R | R, Racket, Ragel, Raku, react, ReasonML, reg, reStructuredText, Rexx, Ruby, Rust
-S | SAS, Sass, Scala, Scheme, Scilab, SCSS, Sed, Smalltalk, Smarty, Snobol, Solidity, SPARQL, SQL, SquidConf, Standard ML, stas, Stylus, Svelte, Swift, SYSTEMD, systemverilog
+S | SAS, Sass, Scala, Scheme, Scilab, SCSS, Sed, Smali, Smalltalk, Smarty, Snobol, Solidity, SPARQL, SQL, SquidConf, Standard ML, stas, Stylus, Svelte, Swift, SYSTEMD, systemverilog
T | TableGen, TASM, Tcl, Tcsh, Termcap, Terminfo, Terraform, TeX, Thrift, TOML, TradingView, Transact-SQL, Turing, Turtle, Twig, TypeScript, TypoScript, TypoScriptCssData, TypoScriptHtmlData
V | VB.net, verilog, VHDL, VHS, VimL, vue
W | WDTE
diff --git a/lexers/embedded/smali.xml b/lexers/embedded/smali.xml
new file mode 100644
index 0000000..e468766
--- /dev/null
+++ b/lexers/embedded/smali.xml
@@ -0,0 +1,73 @@
+
+
+
+ Smali
+ smali
+ *.smali
+ text/smali
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lexers/testdata/smali.actual b/lexers/testdata/smali.actual
new file mode 100644
index 0000000..50d7fd1
--- /dev/null
+++ b/lexers/testdata/smali.actual
@@ -0,0 +1,55 @@
+.class LExample;
+.super Ljava/lang/Object;
+.source "Example.java"
+
+
+# instance fields
+.field protected count:I
+
+.field private label:Ljava/lang/String;
+
+
+# direct methods
+.method constructor ()V
+ .registers 1
+
+ .line 1
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+
+ return-void
+.end method
+
+.method public static main([Ljava/lang/String;)V
+ .registers 2
+
+ .line 16
+ sget-object p0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+ const-string v0, "Hello world!"
+
+ invoke-virtual {p0, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+
+ .line 17
+ return-void
+.end method
+
+
+# virtual methods
+.method public getLabel()Ljava/lang/String;
+ .registers 2
+
+ .line 8
+ iget-object v0, p0, LExample;->label:Ljava/lang/String;
+
+ return-object v0
+.end method
+
+.method public setLabel(Ljava/lang/String;)V
+ .registers 2
+
+ .line 12
+ iput-object p1, p0, LExample;->label:Ljava/lang/String;
+
+ .line 13
+ return-void
+.end method
diff --git a/lexers/testdata/smali.expected b/lexers/testdata/smali.expected
new file mode 100644
index 0000000..cfd12fb
--- /dev/null
+++ b/lexers/testdata/smali.expected
@@ -0,0 +1,254 @@
+[
+ {"type":"Keyword","value":".class"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"KeywordType","value":"L"},
+ {"type":"NameClass","value":"Example"},
+ {"type":"Text","value":";"},
+ {"type":"TextWhitespace","value":"\n"},
+ {"type":"Keyword","value":".super"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"KeywordType","value":"L"},
+ {"type":"Text","value":"java/lang/"},
+ {"type":"NameClass","value":"Object"},
+ {"type":"Text","value":";"},
+ {"type":"TextWhitespace","value":"\n"},
+ {"type":"Keyword","value":".source"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"LiteralString","value":"\"Example.java\""},
+ {"type":"TextWhitespace","value":"\n\n\n"},
+ {"type":"Comment","value":"# instance fields\n"},
+ {"type":"Keyword","value":".field"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"Keyword","value":"protected"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"NameVariable","value":"count"},
+ {"type":"Punctuation","value":":"},
+ {"type":"KeywordType","value":"I"},
+ {"type":"TextWhitespace","value":"\n\n"},
+ {"type":"Keyword","value":".field"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"Keyword","value":"private"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"NameVariable","value":"label"},
+ {"type":"Punctuation","value":":"},
+ {"type":"KeywordType","value":"L"},
+ {"type":"Text","value":"java/lang/"},
+ {"type":"NameClass","value":"String"},
+ {"type":"Text","value":";"},
+ {"type":"TextWhitespace","value":"\n\n\n"},
+ {"type":"Comment","value":"# direct methods\n"},
+ {"type":"Keyword","value":".method"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"Keyword","value":"constructor"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"NameFunction","value":"\u003cinit\u003e"},
+ {"type":"Punctuation","value":"()"},
+ {"type":"KeywordType","value":"V"},
+ {"type":"TextWhitespace","value":"\n "},
+ {"type":"Keyword","value":".registers"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"LiteralNumberInteger","value":"1"},
+ {"type":"TextWhitespace","value":"\n\n "},
+ {"type":"Keyword","value":".line"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"LiteralNumberInteger","value":"1"},
+ {"type":"TextWhitespace","value":"\n "},
+ {"type":"Text","value":"invoke-direct"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"Punctuation","value":"{"},
+ {"type":"NameBuiltin","value":"p0"},
+ {"type":"Punctuation","value":"},"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"KeywordType","value":"L"},
+ {"type":"Text","value":"java/lang/"},
+ {"type":"NameClass","value":"Object"},
+ {"type":"Text","value":";"},
+ {"type":"Punctuation","value":"-\u003e"},
+ {"type":"NameFunction","value":"\u003cinit\u003e"},
+ {"type":"Punctuation","value":"()"},
+ {"type":"KeywordType","value":"V"},
+ {"type":"TextWhitespace","value":"\n\n "},
+ {"type":"Text","value":"return-void"},
+ {"type":"TextWhitespace","value":"\n"},
+ {"type":"Keyword","value":".end"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"Keyword","value":"method"},
+ {"type":"TextWhitespace","value":"\n\n"},
+ {"type":"Keyword","value":".method"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"Keyword","value":"public"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"Keyword","value":"static"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"NameFunction","value":"main"},
+ {"type":"Punctuation","value":"("},
+ {"type":"KeywordType","value":"[L"},
+ {"type":"Text","value":"java/lang/"},
+ {"type":"NameClass","value":"String"},
+ {"type":"Text","value":";"},
+ {"type":"Punctuation","value":")"},
+ {"type":"KeywordType","value":"V"},
+ {"type":"TextWhitespace","value":"\n "},
+ {"type":"Keyword","value":".registers"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"LiteralNumberInteger","value":"2"},
+ {"type":"TextWhitespace","value":"\n\n "},
+ {"type":"Keyword","value":".line"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"LiteralNumberInteger","value":"16"},
+ {"type":"TextWhitespace","value":"\n "},
+ {"type":"Text","value":"sget-object"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"NameBuiltin","value":"p0"},
+ {"type":"Punctuation","value":","},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"KeywordType","value":"L"},
+ {"type":"Text","value":"java/lang/"},
+ {"type":"NameClass","value":"System"},
+ {"type":"Text","value":";"},
+ {"type":"Punctuation","value":"-\u003e"},
+ {"type":"NameVariable","value":"out"},
+ {"type":"Punctuation","value":":"},
+ {"type":"KeywordType","value":"L"},
+ {"type":"Text","value":"java/io/"},
+ {"type":"NameClass","value":"PrintStream"},
+ {"type":"Text","value":";"},
+ {"type":"TextWhitespace","value":"\n\n "},
+ {"type":"Text","value":"const-string"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"NameBuiltin","value":"v0"},
+ {"type":"Punctuation","value":","},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"LiteralString","value":"\"Hello world!\""},
+ {"type":"TextWhitespace","value":"\n\n "},
+ {"type":"Text","value":"invoke-virtual"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"Punctuation","value":"{"},
+ {"type":"NameBuiltin","value":"p0"},
+ {"type":"Punctuation","value":","},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"NameBuiltin","value":"v0"},
+ {"type":"Punctuation","value":"},"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"KeywordType","value":"L"},
+ {"type":"Text","value":"java/io/"},
+ {"type":"NameClass","value":"PrintStream"},
+ {"type":"Text","value":";"},
+ {"type":"Punctuation","value":"-\u003e"},
+ {"type":"NameFunction","value":"println"},
+ {"type":"Punctuation","value":"("},
+ {"type":"KeywordType","value":"L"},
+ {"type":"Text","value":"java/lang/"},
+ {"type":"NameClass","value":"String"},
+ {"type":"Text","value":";"},
+ {"type":"Punctuation","value":")"},
+ {"type":"KeywordType","value":"V"},
+ {"type":"TextWhitespace","value":"\n\n "},
+ {"type":"Keyword","value":".line"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"LiteralNumberInteger","value":"17"},
+ {"type":"TextWhitespace","value":"\n "},
+ {"type":"Text","value":"return-void"},
+ {"type":"TextWhitespace","value":"\n"},
+ {"type":"Keyword","value":".end"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"Keyword","value":"method"},
+ {"type":"TextWhitespace","value":"\n\n\n"},
+ {"type":"Comment","value":"# virtual methods\n"},
+ {"type":"Keyword","value":".method"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"Keyword","value":"public"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"NameFunction","value":"getLabel"},
+ {"type":"Punctuation","value":"()"},
+ {"type":"KeywordType","value":"L"},
+ {"type":"Text","value":"java/lang/"},
+ {"type":"NameClass","value":"String"},
+ {"type":"Text","value":";"},
+ {"type":"TextWhitespace","value":"\n "},
+ {"type":"Keyword","value":".registers"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"LiteralNumberInteger","value":"2"},
+ {"type":"TextWhitespace","value":"\n\n "},
+ {"type":"Keyword","value":".line"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"LiteralNumberInteger","value":"8"},
+ {"type":"TextWhitespace","value":"\n "},
+ {"type":"Text","value":"iget-object"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"NameBuiltin","value":"v0"},
+ {"type":"Punctuation","value":","},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"NameBuiltin","value":"p0"},
+ {"type":"Punctuation","value":","},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"KeywordType","value":"L"},
+ {"type":"NameClass","value":"Example"},
+ {"type":"Text","value":";"},
+ {"type":"Punctuation","value":"-\u003e"},
+ {"type":"NameVariable","value":"label"},
+ {"type":"Punctuation","value":":"},
+ {"type":"KeywordType","value":"L"},
+ {"type":"Text","value":"java/lang/"},
+ {"type":"NameClass","value":"String"},
+ {"type":"Text","value":";"},
+ {"type":"TextWhitespace","value":"\n\n "},
+ {"type":"Text","value":"return-object"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"NameBuiltin","value":"v0"},
+ {"type":"TextWhitespace","value":"\n"},
+ {"type":"Keyword","value":".end"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"Keyword","value":"method"},
+ {"type":"TextWhitespace","value":"\n\n"},
+ {"type":"Keyword","value":".method"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"Keyword","value":"public"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"NameFunction","value":"setLabel"},
+ {"type":"Punctuation","value":"("},
+ {"type":"KeywordType","value":"L"},
+ {"type":"Text","value":"java/lang/"},
+ {"type":"NameClass","value":"String"},
+ {"type":"Text","value":";"},
+ {"type":"Punctuation","value":")"},
+ {"type":"KeywordType","value":"V"},
+ {"type":"TextWhitespace","value":"\n "},
+ {"type":"Keyword","value":".registers"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"LiteralNumberInteger","value":"2"},
+ {"type":"TextWhitespace","value":"\n\n "},
+ {"type":"Keyword","value":".line"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"LiteralNumberInteger","value":"12"},
+ {"type":"TextWhitespace","value":"\n "},
+ {"type":"Text","value":"iput-object"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"NameBuiltin","value":"p1"},
+ {"type":"Punctuation","value":","},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"NameBuiltin","value":"p0"},
+ {"type":"Punctuation","value":","},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"KeywordType","value":"L"},
+ {"type":"NameClass","value":"Example"},
+ {"type":"Text","value":";"},
+ {"type":"Punctuation","value":"-\u003e"},
+ {"type":"NameVariable","value":"label"},
+ {"type":"Punctuation","value":":"},
+ {"type":"KeywordType","value":"L"},
+ {"type":"Text","value":"java/lang/"},
+ {"type":"NameClass","value":"String"},
+ {"type":"Text","value":";"},
+ {"type":"TextWhitespace","value":"\n\n "},
+ {"type":"Keyword","value":".line"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"LiteralNumberInteger","value":"13"},
+ {"type":"TextWhitespace","value":"\n "},
+ {"type":"Text","value":"return-void"},
+ {"type":"TextWhitespace","value":"\n"},
+ {"type":"Keyword","value":".end"},
+ {"type":"TextWhitespace","value":" "},
+ {"type":"Keyword","value":"method"},
+ {"type":"TextWhitespace","value":"\n"}
+]