Here's the input to the translator:
// This is a comment #import "foobar" int i = 1; -(void)mySelector:(int)count { int foo = 3; int bar; }
The results of the translation are:
-- This is a comment require "foobar" local i = 1; function mySelector(count) local foo = 3; local bar; end
The Lua code is:
require 're' parser = re.compile[[ S <- <externaldeclaration>* WS <- [ %nl\t]+ NWS <- [ %nl\t]* IDENTIFIER <- ([%a$_] [%a$_%d]*) LINECOMMENT <- '//' {[^%nl]* %nl} -> '--%1' COMMENT <- '/*' <CLOSECOMMENT> -> '--' COMMENTMIDDLE <- {.} <CLOSECOMMENT> -> '%1' CLOSECOMMENT <- '*/' / <COMMENTMIDDLE> IMPORT <- ('#import' <WS> <filespecification>) / ('#include' <WS> <filespecification>) filespecification <- (["<] {[%a%d%s/_]+} [">]{%nl}) -> 'require "%1"%2' preprocessordeclaration <- <IMPORT> identifier <- <IDENTIFIER> DECIMALLITERAL <- {%d+} <IntegerTypeSuffix>? -> '%1' IntegerTypeSuffix <- [uUlL] STRINGLITERAL <- { ('"' ( <EscapeSequence> / [^\"] )* '%') } -> '%1' EscapeSequence <- '\' [btnfr"'\] / <OctalEscape> OctalEscape <- ('\' [0-3] [0-7] [0-7]) / ('\' [0-7] [0-7]) / ('%' [0-7]) constant <- <DECIMALLITERAL> externaldeclaration <- <WS> / <COMMENT> / <LINECOMMENT> / <preprocessordeclaration> / <declaration> / <instancemethoddefinition> typespecifier <- ('void' / 'char' / 'short' / 'int' / 'long' / 'float' / 'double' / 'signed' / 'unsigned' / <identifier>) declaration <- ( <declarationspecifiers> <NWS> <initdeclaratorlist>? <NWS> ';' <NWS> ) declarationspecifiers <- <typespecifier> initdeclaratorlist <- <declarator> declarator <- <directdeclarator> directdeclarator <- {<identifier> <NWS> ( '=' <NWS> <primaryexpression> )? <NWS> } -> "local %1;" expression <- (<assignmentexpression> <NWS> (',' <NWS> <assignmentexpression> <NWS> )* ) assignmentexpression <- <conditionalexpression> ( <NWS> <assignmentoperator> <NWS> <assignmentexpression>)? assignmentoperator <- ('=' / '*=' / '/=' / '%=' / '+=' / '-=' / '<<=' / '>>=' / '&=' / '^=' / '|=') <NWS> conditionalexpression <- <logicalorexpression> <NWS> ('?' <NWS> <logicalorexpression> <NWS> ':' <NWS> <logicalorexpression> <NWS>)? constantexpression <- <conditionalexpression> logicalorexpression <- <logicalandexpression> <NWS> ('||' <NWS> <logicalandexpression> <NWS>)* logicalandexpression <- <inclusiveorexpression> <NWS> ('&&' <NWS> <inclusiveorexpression> <NWS>)* inclusiveorexpression <- <exclusiveorexpression> <NWS> ('|' <NWS> <exclusiveorexpression> <NWS>)* exclusiveorexpression <- <andexpression> <NWS> ('^' <NWS> <andexpression> <NWS>)* andexpression <- <equalityexpression> <NWS> ('&' <NWS> <equalityexpression> <NWS>)* equalityexpression <- <relationalexpression> <NWS> (('!=' / '==') <NWS> <relationalexpression> <NWS>)* relationalexpression <- <shiftexpression> <NWS> (('<' / '>' / '<=' / '>=') <NWS> <shiftexpression> <NWS>)* shiftexpression <- <additiveexpression> <NWS> (('<<' / '>>') <NWS> <additiveexpression> <NWS>)* additiveexpression <- <multiplicativeexpression> <NWS> (('+' / '-') <NWS> <multiplicativeexpression> <NWS>)* multiplicativeexpression <- <castexpression> <NWS> (('*' / '/' / '%') <NWS> <castexpression> <NWS>)* castexpression <- ('(' <NWS> <typename> <NWS> ')' <NWS> <castexpression>) / (<unaryexpression> <NWS>) unaryexpression <- <postfixexpression> / ('++' <NWS> <unaryexpression> <NWS> ) / ('--' <NWS> <unaryexpression> <NWS> ) / (<unaryoperator> <NWS> <castexpression> <NWS> ) / ('sizeof' <NWS> ( ('(' <NWS> <typename> <NWS> ')') / (<unaryexpression> <NWS>) ) ) unaryoperator <- ( ( '&' / '*' / '-' / '~' / '!' ) <NWS>) postfixexpression <- <primaryexpression> ( ('[' <NWS> <expression> <NWS> ']' <NWS>) / ('.' <NWS> <identifier> <NWS>) / ('->' <NWS> <identifier> <NWS>) / ('++' <NWS>) / ('--' <NWS>) )* primaryexpression <- ( <IDENTIFIER> <NWS> ) / ( <constant> <NWS> ) / ( <STRINGLITERAL> <NWS> ) instancemethoddefinition <- ('-' <NWS> <methoddefinition> <NWS>) methoddefinition <- (<methodtype>)? <methodselector> <compoundstatement> methodselector <- (<keyworddeclarator>+ / <plainselector>) plainselector <- {<selector>} <NWS> -> 'function %1()' selector <- <IDENTIFIER> methodtype <- '(' <NWS> <typename> <NWS> ')' <NWS> typename <- (<typespecifier>) keyworddeclarator <- ( { <selector> } <NWS> ':' <NWS> <parameter> <NWS> ) -> 'function %1(%2)' parameter <- <methodtype> {<IDENTIFIER>} compoundstatement <- '{' <NWS> (<declaration>)* <NWS> <statementlist>? <NWS> '}' <NWS> -> 'end' statementlist <- (<statement>)+ statement <- <WS> / ';' / (<expression> <NWS> ';') / <compoundstatement> / <selectionstatement> selectionstatement <- ('if' <NWS> '(' <NWS> <expression> <NWS> ')' <statement> <NWS> ('else' <NWS> <statement>)? <NWS> ) ]] print(parser:match[[ // This is a comment #import "foobar" int i = 1; -(void)mySelector:(int)count { int foo = 3; int bar; } ]] )
No comments:
Post a Comment