aboutsummaryrefslogtreecommitdiff

Parsing

Elymas has a very simplistic parser (if at all). Parsing works as follows: * Spaces separate things. * If a # is encountered, ignore rest of line. This implements comments. * If a sequence of digits is encountered, this is an integer literal and gets pushed to the stack. * If something looks like a float, i.e. matches (\d[0-9.]*([eE]-?\d+)?), this is a float literal and gets pushed to the stack. * If a " is encountered, a string literal begins. Within a string, backslash escapes special characters. \\ becomes single backslash, \n is a new line, \r is a carriage return, \0 is the NUL character (all bits zero). All other (non-escaped) characters just become part of the string. * If a sequence of alphanumeric characters (a-zA-Z0-9) is encountered, it is looked up in the current scope. This is how normal functios like dump get referenced. * If a sequence of non-alphanumeric characters is encountered, it is looked up in the current scope. This is how functions like _ work. * If a sequence starts with non-alphanumeric characters, but then an alphanumeric character is encountered, this latter part is converted to a string literal (backslash escapes do not apply) and pushed to the stack. Afterwards the non-alphanumeric prefix is looked up in the current scope. This is how /abc becomes "abc": The string is created during parsing and afterwards the identity function is applied.

Additionally, the parser has a quote-level counter which is increased by { and decreased by }. If the quote-level is non-zero, i.e. the parser is in quote mode, the resolution of names is postponed and a function object doing the resolution is pushed instead.