240 likes | 515 Views
Syntax analysis. How ScriptBasic performs Syntax analysis. What is the role of syntax analysis What is the assumed syntax of a program What tables drive syntax analysis Creating the tables Pseudo terminals. Contents. Who this presentation is for. Curious (why things happen?)
E N D
Syntax analysis How ScriptBasic performs Syntax analysis
What is the role of syntax analysis What is the assumed syntax of a program What tables drive syntax analysis Creating the tables Pseudo terminals Contents
Who this presentation is for • Curious (why things happen?) • Want to learn and understand how ScriptBasic works • Want to modify ScriptBasic NOT for those, who just • want to program in scriba
Role of syntax analysis • Reader • Lexer • SYNTAX ANALYSIS • Builder • Execution
General purpose • The syntax analyzer is a general purpose table driven syntax analyzer that could be used for other syntaxes not hard coded for ScriptBasic • The first definition that fits is used. • Easy to maintain but slower than special purpose analyzer
Syntax assumed • Program is series of lines • Lines are (usually) terminated by new line • A line is series of terminal and pseudo-terminal symbols • No block of code { } or BEGIN END • handled by go|come_forward|backward pseudo terminals • Predefined pseudo terminal symbols, like ‘expression’
Tables defining syntax • Binary operators • Unary operators • Built-in functions • Commands • List of commands in the order syntax analyzer checks them against the lines
Creating the tables • syntax.def is a readable format • syntaxer.pl creates the syntax.c • headerer.pl creates the syntax.h files.
Terminals and pseudo terminals • ‘module’ is a terminal symbol (keyword) • nl is terminal symbol (character) • float is terminal symbol • lval, expression are pseudo terminals • can create complex code (one way street with dead end effect!) • can have side effect
Code generated • Code is array of nodes • A node contains OpCode • list of command parameters (each is a node) • operands list (operators or function) • value (constant node) • Serial number (variable node) • start point and arguments (user defined function) • car and cdr values for list head nodes • See builder.c struct _cNODE;
Example • GOTO: 'goto' label nl • OpCode: CMD_GOTO • Parameter.CommandArgument.Argument.pNodecontains the node id of the line for label
Example • ELSIF: 'else' 'if' * expression 'then' come_forward(IF) go_forward(IF) nl • OpCode: CMD_ELSIF • Parameter.CommandArgument.Argument.pNodecontains the node id of the expression • Parameter.CommandArgument.next next paremeter node: • Parameter.CommandArgument.Argument.pNode where to go if expression fails
Pseudo terminals 1/10 • nl • tab These are the simplest pseudo-terminal symbols, because they are real terminals, just hard to write into a text file.
Pseudo terminals 2/10 • expression • expression_list Handles an expression or a comma separated list of expressions and creates nodes. OWSWDE
Pseudo terminals 3/10 • string • integer • float These are simple terminals.
Pseudo terminals 4/10 • symbol a symbol (in name space) • absolute_symbol an absolute symbol • name_space an absolute symbol that sets the name space (no code) • end_name_space end a name space (no code)
Pseudo terminals 5/10 • lval a left value • lval_list a left value list separated by commas • local local variable • local_list list of local variables
Pseudo terminals 6/10 • function a function name where it is defined • thisfn the name of the currently defined function or procedure • arg_num placeholder to store the number of arguments • local_start starts a local scope • local_end ends of local scope
Pseudo terminals 7/10 • label a label used in goto • label_def a label when defined
Pseudo terminals 8/10 • cname constant name • cval constant value correspondingtoconstant name These do not generate code, have only side effects defining a constant. (cval defines a constant for the name last appeared for cname)
Pseudo terminals 9/10 • go_backcreates code • go_forwardcreates code • come_backhas side effect • come_forwardhas side effect These are used instead of code bracketing. There is a jump stack where node pointers are pushed and taken from.
Pseudo terminals 10/10 • * star character OWSWDE • noexec no code is generated from the line
Special commands • All lines are analyzed by the C functionex_IsCommandThisexcept those defining special analysis function • CALL/CALL (ex_IsCommandCALL) • OPEN/OPEN (ex_IsCommandOPEN)