diff --git a/README.md b/README.md index 3b0577937..39c98e875 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 000000000..e468766d1 --- /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 000000000..50d7fd1bb --- /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 000000000..cfd12fb54 --- /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"} +]