diff options
author | Adrian Thurston <thurston@complang.org> | 2014-01-14 20:16:55 -0500 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2014-01-14 20:16:55 -0500 |
commit | 719bedbccdf190d173c2078415c29553c6beecb3 (patch) | |
tree | d8888c385801d8868f145116e407da64ee9ab91e /src | |
parent | aa51dab49b282283a7e7b45ea65221f3eb87b8c0 (diff) | |
download | colm-719bedbccdf190d173c2078415c29553c6beecb3.tar.gz |
added backtick lexical syntax for literal tokens
Added a new syntax for literal tokens. A single backtick is starts the literal.
Ends at whitespace or ] in second or greater position.
The zero length token is now just a plain backtick.
Removed comma as separator in literal statement.
Single-quoted strings are now treated like double-quoted strings. They may
appear in expressions and are concatenated with the other string forms.
Allowing ',' in parameter and argument lists to separate arguments,
eg foo('a', 'b').
Diffstat (limited to 'src')
-rw-r--r-- | src/colm.lm | 92 | ||||
-rw-r--r-- | src/loadcolm.cc | 205 | ||||
-rw-r--r-- | src/parsetree.cc | 29 | ||||
-rw-r--r-- | src/synthesis.cc | 14 |
4 files changed, 239 insertions, 101 deletions
diff --git a/src/colm.lm b/src/colm.lm index d90bc895..35a155c2 100644 --- a/src/colm.lm +++ b/src/colm.lm @@ -68,13 +68,14 @@ lex ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' ) * / - token number / ( '0' .. '9' ) + / + token number + / ( '0' .. '9' ) + / - token lit / - '\'' . ( ^( '\'' | '\\' ) | '\\' . any )* . '\'' - / + token backtick_lit + / '`' . ^( ' ' | '\n' | '\t' | ']' )* | '`]' / token DQ / '\"' / ni + token SQ / '\'' / ni token TILDE / '~' / ni token SQOPEN /'['/ @@ -114,15 +115,23 @@ end lex token CONS_DQ / '\"' / - token CONS_NL / '\n' / + token CONS_DQ_NL / '\n' / token CONS_SQOPEN / '[' / token CONS_SQCLOSE / ']' / - token cons_data + token dq_cons_data / ( ^( '\n' | '\"' | '[' | ']' | '\\' ) | '\\' . any )+ / end lex + token CONS_SQ / '\'' / + token CONS_SQ_NL / '\n' / + + token sq_cons_data + / ( ^( '\n' | '\'' | '\\' ) | '\\' . any )+ / +end + +lex token TILDE_NL / '\n' / token tilde_data / ( ^'\n' )+ / @@ -203,7 +212,7 @@ def root_item | [include] :Include commit def include - [INCLUDE lit] + [INCLUDE SQ SqConsDataList: sq_cons_data* sq_lit_term] def precedence_def [pred_type pred_token_list] @@ -219,7 +228,7 @@ def pred_token_list def pred_token [region_qual id] :Id -| [region_qual lit] :Lit +| [region_qual backtick_lit] :Lit def pre_eof_def [PREEOF COPEN lang_stmt_list CCLOSE] @@ -249,12 +258,17 @@ def global_def [GLOBAL var_def opt_def_init] def iter_def - [ITER id POPEN ParamVarDefList: param_var_def* PCLOSE + [ITER id POPEN ParamVarDefList: param_var_def_list PCLOSE COPEN lang_stmt_list CCLOSE] def reference_type_ref [REF LT type_ref GT] +def param_var_def_list + [param_var_def param_var_def_list] +| [param_var_def COMMA param_var_def_list] +| [] + def param_var_def [id COLON type_ref] :Type | [id COLON reference_type_ref] :Ref @@ -265,7 +279,7 @@ def opt_export def function_def [opt_export type_ref id - POPEN ParamVarDefList: param_var_def* PCLOSE + POPEN ParamVarDefList: param_var_def_list PCLOSE COPEN lang_stmt_list CCLOSE] def context_var_def @@ -278,11 +292,11 @@ def literal_def [LITERAL literal_list] def literal_list - [literal_list COMMA literal_item] :Item + [literal_list literal_item] :Item | [literal_item] :Base def literal_item - [NiLeft: opt_no_ignore lit NiRight: opt_no_ignore] + [NiLeft: opt_no_ignore backtick_lit NiRight: opt_no_ignore] def opt_no_ignore [NI] :Ni @@ -350,7 +364,7 @@ def ignore_def def prod_el [opt_prod_el_name region_qual id opt_repeat] :Id -| [opt_prod_el_name region_qual lit opt_repeat] :Lit +| [opt_prod_el_name region_qual backtick_lit opt_repeat] :Lit def opt_prod_el_name [id COLON] :Name @@ -406,8 +420,13 @@ def optional_else [ELSE block_or_single] :Else | [] +def call_arg_list + [code_expr call_arg_list] +| [code_expr COMMA call_arg_list] +| [] + def iter_call - [E1 var_ref POPEN CodeExprList: code_expr* PCLOSE] :Call + [E1 var_ref POPEN call_arg_list PCLOSE] :Call | [E2 id] :Id | [E3 code_expr] :Expr @@ -433,10 +452,10 @@ def var_def [id COLON type_ref] def print_stmt - [PRINT POPEN CodeExprList: code_expr* PCLOSE] :Tree -| [PRINTS POPEN CodeExprList: code_expr* PCLOSE] :PrintStream -| [PRINT_XML POPEN CodeExprList: code_expr* PCLOSE] :Xml -| [PRINT_XML_AC POPEN CodeExprList: code_expr* PCLOSE] :XmlAc + [PRINT POPEN call_arg_list PCLOSE] :Tree +| [PRINTS POPEN call_arg_list PCLOSE] :PrintStream +| [PRINT_XML POPEN call_arg_list PCLOSE] :Xml +| [PRINT_XML_AC POPEN call_arg_list PCLOSE] :XmlAc def expr_stmt [code_expr] @@ -479,8 +498,7 @@ def opt_eos def code_factor [number] :Number -| [lit] :Lit -| [var_ref POPEN CodeExprList: code_expr* PCLOSE] :Call +| [var_ref POPEN call_arg_list PCLOSE] :Call | [var_ref] :VarRef | [NIL] :Nil | [TRUE] :True @@ -491,10 +509,10 @@ def code_factor | [PARSE_STOP opt_capture type_ref opt_field_init accumulate] :ParseStop | [CONS opt_capture type_ref opt_field_init constructor] :Cons | [MATCH var_ref pattern] :Match -| [cstring] :String +| [string] :String | [type_ref IN var_ref] :In -| [MAKE_TREE POPEN MakeTreeExprList: code_expr* PCLOSE] :MakeTree -| [MAKE_TOKEN POPEN MakeTokenExprList: code_expr* PCLOSE] :MakeToken +| [MAKE_TREE POPEN call_arg_list PCLOSE] :MakeTree +| [MAKE_TOKEN POPEN call_arg_list PCLOSE] :MakeToken | [TYPEID LT type_ref GT] :TypeId | [NEW code_factor] :New | [CAST LT type_ref GT code_factor] :Cast @@ -538,7 +556,10 @@ def opt_label | [] def dq_lit_term - [CONS_DQ] | [CONS_NL] + [CONS_DQ] | [CONS_DQ_NL] + +def sq_lit_term + [CONS_SQ] | [CONS_SQ_NL] def opt_tilde_data [tilde_data] @@ -546,19 +567,21 @@ def opt_tilde_data def pattern_el_lel [region_qual id opt_repeat] :Id -| [region_qual lit opt_repeat] :Lit +| [region_qual backtick_lit opt_repeat] :Lit def pattern_el [opt_label pattern_el_lel] :PatternEl | [DQ LitpatElList: litpat_el* dq_lit_term] :Dq +| [SQ SqConsDataList: sq_cons_data* sq_lit_term] :Sq | [TILDE opt_tilde_data TILDE_NL] :Tilde def litpat_el - [cons_data] :ConsData + [dq_cons_data] :ConsData | [CONS_SQOPEN PatternElList: pattern_el* CONS_SQCLOSE] :SubList def pattern_top_el [DQ LitpatElList: litpat_el* dq_lit_term] :Dq +| [SQ SqConsDataList: sq_cons_data* sq_lit_term] :Sq | [TILDE opt_tilde_data TILDE_NL] :Tilde | [SQOPEN PatternElList: pattern_el* SQCLOSE] :SubList @@ -576,19 +599,22 @@ def pattern def E1 [] def E2 [] def E3 [] +def E4 [] def cons_el - [E1 region_qual lit] :Lit + [E1 region_qual backtick_lit] :Lit | [E1 DQ LitConsElList: lit_cons_el* dq_lit_term] :Dq +| [E1 SQ SqConsDataList: sq_cons_data* sq_lit_term] :Sq | [E1 TILDE opt_tilde_data TILDE_NL] :Tilde | [E2 code_expr] :CodeExpr def lit_cons_el - [cons_data] :ConsData + [dq_cons_data] :ConsData | [CONS_SQOPEN ConsElList: cons_el* CONS_SQCLOSE] :SubList def cons_top_el [DQ LitConsElList: lit_cons_el* dq_lit_term] :Dq +| [SQ SqConsDataList: sq_cons_data* sq_lit_term] :Sq | [TILDE opt_tilde_data TILDE_NL] :Tilde | [SQOPEN ConsElList: cons_el* SQCLOSE] :SubList @@ -605,15 +631,17 @@ def constructor def accum_el [E1 DQ LitAccumElList: lit_accum_el* dq_lit_term] :Dq +| [E1 SQ SqConsDataList: sq_cons_data* sq_lit_term] :Sq | [E1 TILDE opt_tilde_data TILDE_NL] :Tilde | [E2 code_expr] :CodeExpr def lit_accum_el - [cons_data] :ConsData + [dq_cons_data] :ConsData | [CONS_SQOPEN AccumElList: accum_el* CONS_SQCLOSE] :SubList def accum_top_el [DQ LitAccumElList: lit_accum_el* dq_lit_term] :Dq +| [SQ SqConsDataList: sq_cons_data* sq_lit_term] :Sq | [TILDE opt_tilde_data TILDE_NL] :Tilde | [SQOPEN AccumElList: accum_el* SQCLOSE] :SubList @@ -630,15 +658,17 @@ def accumulate def string_el [E1 DQ LitStringElList: lit_string_el* dq_lit_term] :Dq +| [E1 SQ SqConsDataList: sq_cons_data* sq_lit_term] :Sq | [E1 TILDE opt_tilde_data TILDE_NL] :Tilde | [E2 code_expr] :CodeExpr def lit_string_el - [cons_data] :ConsData + [dq_cons_data] :ConsData | [CONS_SQOPEN StringElList: string_el* CONS_SQCLOSE] :SubList def string_top_el [DQ LitStringElList: lit_string_el* dq_lit_term] :Dq +| [SQ SqConsDataList: sq_cons_data* sq_lit_term] :Sq | [TILDE opt_tilde_data TILDE_NL] :Tilde | [SQOPEN StringElList: string_el* SQCLOSE] :SubList @@ -646,7 +676,7 @@ def string_list [string_top_el string_list] :List | [string_top_el] :Base -def cstring +def string [string_list] # diff --git a/src/loadcolm.cc b/src/loadcolm.cc index 8eaedd18..3ed822fc 100644 --- a/src/loadcolm.cc +++ b/src/loadcolm.cc @@ -419,11 +419,12 @@ struct LoadColm break; } case pattern_el_lel::_Lit: { - String lit = typeOrLit.lit().data(); - list = patternElType( typeOrLit.lit().loc(), patternVarRef, + String lit = typeOrLit.backtick_lit().data(); + list = patternElType( typeOrLit.backtick_lit().loc(), patternVarRef, nspaceQual, lit, repeatType ); break; }} + return list; } @@ -444,7 +445,12 @@ struct LoadColm switch ( patternEl.prodName() ) { case pattern_el::_Dq: { list = walkLitpatElList( patternEl.LitpatElList(), - patternEl.dq_lit_term().CONS_NL(), patternVarRef ); + patternEl.dq_lit_term().CONS_DQ_NL(), patternVarRef ); + break; + } + case pattern_el::_Sq: { + list = walkPatSqConsDataList( patternEl.SqConsDataList(), + patternEl.sq_lit_term().CONS_SQ_NL() ); break; } case pattern_el::_Tilde: { @@ -470,9 +476,9 @@ struct LoadColm PatternItemList *list = 0; switch ( litpatEl.prodName() ) { case litpat_el::_ConsData: { - String consData = unescape( litpatEl.cons_data().text().c_str() ); + String consData = unescape( litpatEl.dq_cons_data().text().c_str() ); PatternItem *patternItem = PatternItem::cons( PatternItem::InputTextForm, - litpatEl.cons_data().loc(), consData ); + litpatEl.dq_cons_data().loc(), consData ); list = PatternItemList::cons( patternItem ); break; } @@ -483,7 +489,55 @@ struct LoadColm return list; } - PatternItemList *walkLitpatElList( _repeat_litpat_el litpatElList, CONS_NL Nl, + PatternItemList *walkPatSqConsDataList( _repeat_sq_cons_data sqConsDataList, CONS_SQ_NL Nl ) + { + PatternItemList *list = new PatternItemList; + while ( !sqConsDataList.end() ) { + String consData = unescape( sqConsDataList.value().text().c_str() ); + PatternItem *patternItem = PatternItem::cons( PatternItem::InputTextForm, + sqConsDataList.value().loc(), consData ); + PatternItemList *tail = PatternItemList::cons( patternItem ); + list = patListConcat( list, tail ); + + sqConsDataList = sqConsDataList.next(); + } + + if ( Nl != 0 ) { + String nl = unescape( Nl.data() ); + PatternItem *patternItem = PatternItem::cons( PatternItem::InputTextForm, + Nl.loc(), nl ); + PatternItemList *term = PatternItemList::cons( patternItem ); + list = patListConcat( list, term ); + } + + return list; + } + + ConsItemList *walkConsSqConsDataList( _repeat_sq_cons_data sqConsDataList, CONS_SQ_NL Nl ) + { + ConsItemList *list = new ConsItemList; + while ( !sqConsDataList.end() ) { + String consData = unescape( sqConsDataList.value().text().c_str() ); + ConsItem *consItem = ConsItem::cons( + sqConsDataList.value().loc(), ConsItem::InputText, consData ); + ConsItemList *tail = ConsItemList::cons( consItem ); + list = consListConcat( list, tail ); + + sqConsDataList = sqConsDataList.next(); + } + + if ( Nl != 0 ) { + String nl = unescape( Nl.data() ); + ConsItem *consItem = ConsItem::cons( + Nl.loc(), ConsItem::InputText, nl ); + ConsItemList *term = ConsItemList::cons( consItem ); + list = consListConcat( list, term ); + } + + return list; + } + + PatternItemList *walkLitpatElList( _repeat_litpat_el litpatElList, CONS_DQ_NL Nl, LangVarRef *patternVarRef ) { PatternItemList *list = new PatternItemList; @@ -522,7 +576,12 @@ struct LoadColm switch ( patternTopEl.prodName() ) { case pattern_top_el::_Dq: { list = walkLitpatElList( patternTopEl.LitpatElList(), - patternTopEl.dq_lit_term().CONS_NL(), patternVarRef ); + patternTopEl.dq_lit_term().CONS_DQ_NL(), patternVarRef ); + break; + } + case pattern_top_el::_Sq: { + list = walkPatSqConsDataList( patternTopEl.SqConsDataList(), + patternTopEl.sq_lit_term().CONS_SQ_NL() ); break; } case pattern_top_el::_Tilde: { @@ -617,8 +676,8 @@ struct LoadColm break; } case pred_token::_Lit: { - String lit = predToken.lit().data(); - predDecl = predTokenLit( predToken.lit().loc(), lit, nspaceQual ); + String lit = predToken.backtick_lit().data(); + predDecl = predTokenLit( predToken.backtick_lit().loc(), lit, nspaceQual ); break; }} return predDecl; @@ -670,10 +729,15 @@ struct LoadColm StmtList *walkInclude( include Include ) { - String lit = Include.lit().data(); - String file; - bool unused; - prepareLitString( file, unused, lit, Include.lit().loc() ); + String lit = ""; + _repeat_sq_cons_data sqConsDataList = Include.SqConsDataList(); + while ( !sqConsDataList.end() ) { + colm_data *data = sqConsDataList.value().data(); + lit.append( data->data, data->length ); + sqConsDataList = sqConsDataList.next(); + } + + String file = unescape( lit ); const char *argv[2]; argv[0] = file.data; @@ -829,8 +893,8 @@ struct LoadColm break; } case prod_el::_Lit: { - String lit = El.lit().data(); - ProdEl *prodEl = prodElLiteral( El.lit().loc(), lit, + String lit = El.backtick_lit().data(); + ProdEl *prodEl = prodElLiteral( El.backtick_lit().loc(), lit, nspaceQual, captureField, repeatType, false ); appendProdEl( list, prodEl ); break; @@ -1100,22 +1164,21 @@ struct LoadColm BaseParser::cflDef( ntDef, objectDef, defList ); } - CallArgVect *walkCodeExprList( _repeat_code_expr codeExprList ) + CallArgVect *walkCallArgList( call_arg_list callArgList ) { CallArgVect *callArgVect = new CallArgVect; - while ( !codeExprList.end() ) { - code_expr codeExpr = codeExprList.value(); + while ( callArgList.code_expr() != 0 ) { + code_expr codeExpr = callArgList.code_expr(); LangExpr *expr = walkCodeExpr( codeExpr ); callArgVect->append( new CallArg(expr) ); - codeExprList = codeExprList.next(); + callArgList = callArgList._call_arg_list(); } return callArgVect; } LangStmt *walkPrintStmt( print_stmt &printStmt ) { - _repeat_code_expr codeExprList = printStmt.CodeExprList(); - CallArgVect *exprVect = walkCodeExprList( codeExprList ); + CallArgVect *exprVect = walkCallArgList( printStmt.call_arg_list() ); LangStmt::Type type = LangStmt::PrintType; switch ( printStmt.prodName() ) { @@ -1185,8 +1248,8 @@ struct LoadColm ConsItemList *list = 0; switch ( litConsEl.prodName() ) { case lit_cons_el::_ConsData: { - String consData = unescape( litConsEl.cons_data().text().c_str() ); - ConsItem *consItem = ConsItem::cons( litConsEl.cons_data().loc(), + String consData = unescape( litConsEl.dq_cons_data().text().c_str() ); + ConsItem *consItem = ConsItem::cons( litConsEl.dq_cons_data().loc(), ConsItem::InputText, consData ); list = ConsItemList::cons( consItem ); break; @@ -1199,7 +1262,7 @@ struct LoadColm } ConsItemList *walkLitConsElList( _repeat_lit_cons_el litConsElList, - CONS_NL Nl, TypeRef *consTypeRef ) + CONS_DQ_NL Nl, TypeRef *consTypeRef ) { ConsItemList *list = new ConsItemList; while ( !litConsElList.end() ) { @@ -1224,8 +1287,8 @@ struct LoadColm switch ( consEl.prodName() ) { case cons_el::_Lit: { NamespaceQual *nspaceQual = walkRegionQual( consEl.region_qual() ); - String lit = consEl.lit().data(); - list = consElLiteral( consEl.lit().loc(), consTypeRef, lit, nspaceQual ); + String lit = consEl.backtick_lit().data(); + list = consElLiteral( consEl.backtick_lit().loc(), consTypeRef, lit, nspaceQual ); break; } case cons_el::_Tilde: { @@ -1236,6 +1299,11 @@ struct LoadColm list = ConsItemList::cons( consItem ); break; } + case cons_el::_Sq: { + list = walkConsSqConsDataList( consEl.SqConsDataList(), + consEl.sq_lit_term().CONS_SQ_NL() ); + break; + } case cons_el::_CodeExpr: { LangExpr *consExpr = walkCodeExpr( consEl.code_expr() ); ConsItem *consItem = ConsItem::cons( consExpr->loc, @@ -1245,7 +1313,7 @@ struct LoadColm } case cons_el::_Dq: { list = walkLitConsElList( consEl.LitConsElList(), - consEl.dq_lit_term().CONS_NL(), consTypeRef ); + consEl.dq_lit_term().CONS_DQ_NL(), consTypeRef ); break; }} return list; @@ -1268,7 +1336,12 @@ struct LoadColm switch ( consTopEl.prodName() ) { case cons_top_el::_Dq: { list = walkLitConsElList( consTopEl.LitConsElList(), - consTopEl.dq_lit_term().CONS_NL(), consTypeRef ); + consTopEl.dq_lit_term().CONS_DQ_NL(), consTypeRef ); + break; + } + case cons_top_el::_Sq: { + list = walkConsSqConsDataList( consTopEl.SqConsDataList(), + consTopEl.sq_lit_term().CONS_SQ_NL() ); break; } case cons_top_el::_Tilde: { @@ -1313,8 +1386,8 @@ struct LoadColm ConsItemList *list = 0; switch ( litStringEl.prodName() ) { case lit_string_el::_ConsData: { - String consData = unescape( litStringEl.cons_data().text().c_str() ); - ConsItem *stringItem = ConsItem::cons( litStringEl.cons_data().loc(), + String consData = unescape( litStringEl.dq_cons_data().text().c_str() ); + ConsItem *stringItem = ConsItem::cons( litStringEl.dq_cons_data().loc(), ConsItem::InputText, consData ); list = ConsItemList::cons( stringItem ); break; @@ -1326,7 +1399,7 @@ struct LoadColm return list; } - ConsItemList *walkLitStringElList( _repeat_lit_string_el litStringElList, CONS_NL Nl ) + ConsItemList *walkLitStringElList( _repeat_lit_string_el litStringElList, CONS_DQ_NL Nl ) { ConsItemList *list = new ConsItemList; while ( !litStringElList.end() ) { @@ -1351,7 +1424,12 @@ struct LoadColm switch ( stringEl.prodName() ) { case string_el::_Dq: { list = walkLitStringElList( stringEl.LitStringElList(), - stringEl.dq_lit_term().CONS_NL() ); + stringEl.dq_lit_term().CONS_DQ_NL() ); + break; + } + case string_el::_Sq: { + list = walkConsSqConsDataList( stringEl.SqConsDataList(), + stringEl.sq_lit_term().CONS_SQ_NL() ); break; } case string_el::_Tilde: { @@ -1389,7 +1467,12 @@ struct LoadColm switch ( stringTopEl.prodName() ) { case string_top_el::_Dq: { list = walkLitStringElList( stringTopEl.LitStringElList(), - stringTopEl.dq_lit_term().CONS_NL() ); + stringTopEl.dq_lit_term().CONS_DQ_NL() ); + break; + } + case string_el::_Sq: { + list = walkConsSqConsDataList( stringTopEl.SqConsDataList(), + stringTopEl.sq_lit_term().CONS_SQ_NL() ); break; } case string_top_el::_Tilde: { @@ -1419,7 +1502,7 @@ struct LoadColm return list; } - ConsItemList *walkString( cstring String ) + ConsItemList *walkString( string String ) { ConsItemList *list = walkStringList( String.string_list() ); return list; @@ -1434,8 +1517,8 @@ struct LoadColm ConsItemList *list = 0; switch ( litAccumEl.prodName() ) { case lit_accum_el::_ConsData: { - String consData = unescape( litAccumEl.cons_data().text().c_str() ); - ConsItem *consItem = ConsItem::cons( litAccumEl.cons_data().loc(), + String consData = unescape( litAccumEl.dq_cons_data().text().c_str() ); + ConsItem *consItem = ConsItem::cons( litAccumEl.dq_cons_data().loc(), ConsItem::InputText, consData ); list = ConsItemList::cons( consItem ); break; @@ -1447,7 +1530,7 @@ struct LoadColm return list; } - ConsItemList *walkLitAccumElList( _repeat_lit_accum_el litAccumElList, CONS_NL Nl ) + ConsItemList *walkLitAccumElList( _repeat_lit_accum_el litAccumElList, CONS_DQ_NL Nl ) { ConsItemList *list = new ConsItemList; while ( !litAccumElList.end() ) { @@ -1472,7 +1555,12 @@ struct LoadColm switch ( accumEl.prodName() ) { case accum_el::_Dq: { list = walkLitAccumElList( accumEl.LitAccumElList(), - accumEl.dq_lit_term().CONS_NL() ); + accumEl.dq_lit_term().CONS_DQ_NL() ); + break; + } + case accum_el::_Sq: { + list = walkConsSqConsDataList( accumEl.SqConsDataList(), + accumEl.sq_lit_term().CONS_SQ_NL() ); break; } case accum_el::_Tilde: { @@ -1510,7 +1598,12 @@ struct LoadColm switch ( accumTopEl.prodName() ) { case accum_top_el::_Dq: { list = walkLitAccumElList( accumTopEl.LitAccumElList(), - accumTopEl.dq_lit_term().CONS_NL() ); + accumTopEl.dq_lit_term().CONS_DQ_NL() ); + break; + } + case accum_top_el::_Sq: { + list = walkConsSqConsDataList( accumTopEl.SqConsDataList(), + accumTopEl.sq_lit_term().CONS_SQ_NL() ); break; } case accum_top_el::_Tilde: { @@ -1580,7 +1673,7 @@ struct LoadColm } case code_factor::_Call: { LangVarRef *langVarRef = walkVarRef( codeFactor.var_ref() ); - CallArgVect *exprVect = walkCodeExprList( codeFactor.CodeExprList() ); + CallArgVect *exprVect = walkCallArgList( codeFactor.call_arg_list() ); LangTerm *term = LangTerm::cons( langVarRef->loc, langVarRef, exprVect ); expr = LangExpr::cons( term ); break; @@ -1592,12 +1685,6 @@ struct LoadColm expr = LangExpr::cons( term ); break; } - case code_factor::_Lit: { - String lit = codeFactor.lit().data(); - LangTerm *term = LangTerm::cons( codeFactor.lit().loc(), LangTerm::StringType, lit ); - expr = LangExpr::cons( term ); - break; - } case code_factor::_Parse: { /* The type we are parsing. */ type_ref typeRefTree = codeFactor.type_ref(); @@ -1660,8 +1747,8 @@ struct LoadColm break; } case code_factor::_String: { - ConsItemList *list = walkString( codeFactor.cstring() ); - expr = LangExpr::cons( LangTerm::cons( codeFactor.cstring().loc(), list ) ); + ConsItemList *list = walkString( codeFactor.string() ); + expr = LangExpr::cons( LangTerm::cons( codeFactor.string().loc(), list ) ); break; } case code_factor::_Match: { @@ -1678,13 +1765,13 @@ struct LoadColm break; } case code_factor::_MakeTree: { - CallArgVect *exprList = walkCodeExprList( codeFactor.MakeTreeExprList() ); + CallArgVect *exprList = walkCallArgList( codeFactor.call_arg_list() ); expr = LangExpr::cons( LangTerm::cons( codeFactor.loc(), LangTerm::MakeTreeType, exprList ) ); break; } case code_factor::_MakeToken: { - CallArgVect *exprList = walkCodeExprList( codeFactor.MakeTokenExprList() ); + CallArgVect *exprList = walkCallArgList( codeFactor.call_arg_list() ); expr = LangExpr::cons( LangTerm::cons( codeFactor.loc(), LangTerm::MakeTokenType, exprList ) ); break; @@ -1823,7 +1910,7 @@ struct LoadColm switch ( Tree.prodName() ) { case iter_call::_Call: { LangVarRef *varRef = walkVarRef( Tree.var_ref() ); - CallArgVect *exprVect = walkCodeExprList( Tree.CodeExprList() ); + CallArgVect *exprVect = walkCallArgList( Tree.call_arg_list() ); LangTerm *langTerm = LangTerm::cons( varRef->loc, varRef, exprVect ); iterCall = IterCall::cons( IterCall::IterCallForm, langTerm ); break; @@ -1913,13 +2000,13 @@ struct LoadColm return addParam( paramVarDef.id().loc(), typeRef, id ); } - ParameterList *walkParamVarDefList( _repeat_param_var_def paramVarDefList ) + ParameterList *walkParamVarDefList( param_var_def_list paramVarDefList ) { ParameterList *paramList = new ParameterList; - while ( !paramVarDefList.end() ) { - ObjectField *param = walkParamVarDef( paramVarDefList.value() ); + while ( paramVarDefList.param_var_def() != 0 ) { + ObjectField *param = walkParamVarDef( paramVarDefList.param_var_def() ); appendParam( paramList, param ); - paramVarDefList = paramVarDefList.next(); + paramVarDefList = paramVarDefList._param_var_def_list(); } return paramList; } @@ -2155,11 +2242,11 @@ struct LoadColm bool niLeft = walkOptNoIgnore( literalItem.NiLeft() ); bool niRight = walkOptNoIgnore( literalItem.NiRight() ); - String lit = literalItem.lit().data(); - if ( strcmp( lit, "''" ) == 0 ) - zeroDef( literalItem.lit().loc(), lit, niLeft, niRight ); + String lit = literalItem.backtick_lit().data(); + if ( strcmp( lit, "`" ) == 0 ) + zeroDef( literalItem.backtick_lit().loc(), lit, niLeft, niRight ); else - literalDef( literalItem.lit().loc(), lit, niLeft, niRight ); + literalDef( literalItem.backtick_lit().loc(), lit, niLeft, niRight ); } void walkLiteralList( literal_list literalList ) diff --git a/src/parsetree.cc b/src/parsetree.cc index 08cf0dec..cb522063 100644 --- a/src/parsetree.cc +++ b/src/parsetree.cc @@ -49,20 +49,27 @@ void prepareLitString( String &result, bool &caseInsensitive, caseInsensitive = false; char *src = srcString.data + 1; - char *end = srcString.data + srcString.length() - 1; + char *end = 0; - while ( *end != '\'' && *end != '\"' && *end != '\n' ) { - if ( *end == 'i' ) - caseInsensitive = true; - else { - error( loc ) << "literal string '" << *end << - "' option not supported" << endl; + if ( srcString.data[0] != '`' ) { + end = srcString.data + srcString.length() - 1; + + while ( *end != '\'' && *end != '\"' && *end != '`' && *end != '\n' ) { + if ( *end == 'i' ) + caseInsensitive = true; + else { + error( loc ) << "literal string '" << *end << + "' option not supported" << endl; + } + end -= 1; } - end -= 1; - } - if ( *end == '\n' ) - end++; + if ( *end == '\n' ) + end++; + } + else { + end = srcString.data + srcString.length(); + } char *dest = result.data; int len = 0; diff --git a/src/synthesis.cc b/src/synthesis.cc index a5dd531b..4286320b 100644 --- a/src/synthesis.cc +++ b/src/synthesis.cc @@ -1494,6 +1494,20 @@ UniqueType *LangTerm::evaluateEmbedString( Compiler *pd, CodeVect &code ) const } + /* If there was nothing loaded, load the empty string. We must produce + * something. */ + if ( consItemList->length() == 0 ) { + String result = ""; + + /* Make sure we have this string. */ + StringMapEl *mapEl = 0; + if ( pd->literalStrings.insert( result, &mapEl ) ) + mapEl->value = pd->literalStrings.length()-1; + + code.append( IN_LOAD_STR ); + code.appendWord( mapEl->value ); + } + long items = consItemList->length(); for ( long i = 0; i < items-1; i++ ) code.append( IN_CONCAT_STR ); |