[WikiEN-l] MediaWiki is getting a new programming language

Neil Harris usenet at tonal.clara.co.uk
Mon Jul 6 19:49:09 UTC 2009


stevertigo wrote:
> On Mon, Jul 6, 2009 at 3:54 AM, Neil Harris<usenet at tonal.clara.co.uk> wrote:
>
>   
>> Consider the difference between the ease of writing, say, the Python-like
>>  print "%02x" % find(":", param[1])
>> or even the Lisp-like
>>  (print (fmt "%02x" (find ":" (param 1))))
>> compared to writing an "English-like" equivalent such as
>>  PRINT THE NUMBER OF CHARACTERS BEFORE THE FIRST OCCURRENCE OF THE
>> COLON CHARACTER IN THE FIRST POSITIONAL PARAMETER FORMATTED AS A
>> TWO-DIGIT ZERO-PADDED HEXADECIMAL NUMBER USING LOWERCASE LETTERS FOR THE
>> HEX DIGITS A TO F
>>     
>
> Your example is a bit unfair though, Neil. For one, how would it be parsed?
> Two, it only implies and does not explicitly state the "find/search"
> functionality
> you use in the examples.
>   
Oh, don't tempt me to write an implementation... a grammar for it might 
look something like this:

command ::= print-expr | ...

expr ::= find-expr | param-expr  | arithmetic-expr | strong-expr

no-default-param-expr ::= "THE" ordinal-number-name "POSITIONAL 
PARAMETER" | "THE PARAMETER CALLED" name-expr

param-expr ::= no-default-param-expr ["UNLESS THE PARAMETER IS 
UNDEFINED, IN WHICH CASE USE" expr "INSTEAD"]

find-expr ::= "THE NUMBER OF CHARACTERS BEFORE THE FIRST OCCURRENCE OF" 
expr "IN" expr

arithmetic-expr ::= expr "MULTIPLIED BY" expr | expr "ADDED TO" expr | 
... | "OPEN BRACKETS" expr "CLOSE BRACKETS"

substitution-expr ::= "THE STRING" expr ", SUBSTITUTING THE STRING" expr 
"FOR THE STRING" expr "THROUGHOUT"

string-expr ::= "THE" char-name "CHARACTER"

print-statement ::= "PRINT" expr "FORMATTED AS" print-format

print-format-atom ::= "A LITERAL STRING" | "A" ordinal-number-name 
"-DIGIT" [ "ZERO-PADDED" ] ["HEXADECIMAL" | "OCTAL" | "DECIMAL" ]  
"NUMBER" ["USING" ["UPPERCASE" | "LOWERCASE" "LETTERS FOR THE HEX DIGITS 
A TO F"]

print-format ::= print-format-atom | print-format-atom "FOLLOWED BY" 
print-format

ordinal-number-name ::= "FIRST" | "SECOND" | "THIRD" | "FOURTH" ...

cardinal-number-name ::= "ONE" | "TWO" | "THREE" | "FOUR" ...

and then throw it at a packrat parser or similar shortest-length parser 
for nondeterministic languages... I leave code generation and the 
runtime environment as an exercise for the student. To keep fully within 
the spirit of the exercise, don't forget to add automatic type coercion 
of all data types to strings wherever necessary.

-- Neil




More information about the WikiEN-l mailing list