about summary refs log tree commit diff stats
path: root/015literal_noninteger.cc
blob: 554bcdd5150ba6cfc9cde3aa2c501c4ee2dd43e9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//: Support literal non-integers.

:(scenarios load)
:(scenario noninteger_literal)
def main [
  1:number <- copy 3.14159
]
+parse:   ingredient: {3.14159: "literal-fractional-number"}

:(after "Parsing reagent(string s)")
if (is_noninteger(s)) {
  name = s;
  type = new type_tree("literal-fractional-number", 0);
  set_value(to_double(s));
  return;
}

:(code)
bool is_noninteger(const string& s) {
  return s.find_first_not_of("0123456789-.") == string::npos  // no other characters
      && s.find_first_of("0123456789") != string::npos  // at least one digit
      && s.find('-', 1) == string::npos  // '-' only at first position
      && std::count(s.begin(), s.end(), '.') == 1;  // exactly one decimal point
}

double to_double(string n) {
  char* end = NULL;
  // safe because string.c_str() is guaranteed to be null-terminated
  double result = strtod(n.c_str(), &end);
  assert(*end == '\0');
  return result;
}

void test_is_noninteger() {
  CHECK(!is_noninteger("1234"));
  CHECK(!is_noninteger("1a2"));
  CHECK(is_noninteger("234.0"));
  CHECK(!is_noninteger("..."));
  CHECK(!is_noninteger("."));
  CHECK(is_noninteger("2."));
  CHECK(is_noninteger(".2"));
  CHECK(is_noninteger("-.2"));
  CHECK(is_noninteger("-2."));
  CHECK(!is_noninteger("--.2"));
  CHECK(!is_noninteger(".-2"));
  CHECK(!is_noninteger("..2"));
}
a>
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68


                                              
                                             












                                                                             
                       
 
            

                                                  






                                                                                           
                                                                                    








                                                                                                      
 
                


                                                                                        
 
               
                                                                        
 
                                                                      

              
                                            


                                                                                               
                                                                         
                                 
 
                                                        
                                                                                                                 

                                                                           
                                      
                                                                                         
                                         
                                                                             
 
                     
" SubX syntax file
" Language:    SubX
" Maintainer:  Kartik Agaram <mu@akkartik.com>
" URL:         https://github.com/akkartik/mu
" License:     public domain
"
" Copy this into your ftplugin directory, and add the following to your vimrc
" or to .vim/ftdetect/subx.vim:
"   autocmd BufReadPost,BufNewFile *.subx set filetype=subx

let s:save_cpo = &cpo
set cpo&vim

" setlocal iskeyword=@,48-57,?,!,_,$,-
setlocal formatoptions-=t  " allow long lines
setlocal formatoptions+=c  " but comments should still wrap

setlocal iskeyword+=-,?

" blue tones
" comment colors for dark terminal: 14, 39, 27, 19
" comment colors for light terminal: 19, 27, 39, 6
"? syntax match subxH1Comment /# - .*/ | highlight subxH1Comment cterm=underline ctermfg=27
"? syntax match subxComment /#[^ ].*\|# [^.-].*\|# \?$/ | highlight subxComment ctermfg=27
"? syntax match subxS1Comment /# \..*/ | highlight subxS1Comment ctermfg=19
"? syntax match subxS2Comment /# \. \..*/ | highlight subxS2Comment ctermfg=245

" blue-green tones
syntax match subxH1Comment /# - .*/ | highlight subxH1Comment cterm=underline ctermfg=25
syntax match subxComment /#\( \.\| - \|? \)\@!.*/ | highlight subxComment ctermfg=25
syntax match subxS1Comment /# \..*/ | highlight subxS1Comment ctermfg=19
syntax match subxS2Comment /# \. \..*/ | highlight subxS2Comment ctermfg=245

" grey tones
"? syntax match subxH1Comment /# - .*/ | highlight subxH1Comment cterm=bold,underline
"? syntax match subxComment /#[^ ].*\|# [^.-].*\|# \?$/ | highlight subxComment cterm=bold ctermfg=236
"? hi Normal ctermfg=236
"? syntax match subxS1Comment /# \..*/ | highlight subxS1Comment cterm=bold ctermfg=242
"? syntax match subxS2Comment /# \. \..*/ | highlight subxS2Comment ctermfg=242

set comments-=:#
set comments+=n:#
syntax match subxCommentedCode "#? .*"  | highlight link subxCommentedCode CommentedCode
let b:cmt_head = "#? "

" comment token
syntax match subxDelimiter / \. /  | highlight link subxDelimiter Normal

syntax match subxString %"[^"]*"% | highlight link subxString Constant

"" definitions
" match globals but not registers like 'EAX'
" don't match capitalized words in metadata
" don't match inside strings
syntax match subxGlobal %\(/\)\@<!\<[A-Z][a-z0-9_-]*\>% | highlight link subxGlobal SpecialChar
" tweak the red color from the colorscheme just a tad to improve contrast
highlight SpecialChar ctermfg=160

" functions but not tests, globals or internal functions
syntax match subxFunction "^\(test_\)\@<![a-z][^ ]*\(:\)\@=" | highlight subxFunction cterm=underline ctermfg=130
" tests starting with 'test-'; dark:34 light:64
syntax match subxTest "^test-[^ ]*\(:\)\@=" | highlight subxTest ctermfg=64
" internal functions starting with '_'
syntax match subxMinorFunction "^_[^ ]*\(:\)\@=" | highlight subxMinorFunction ctermfg=95
" other internal labels starting with '$'
syntax match subxLabel "^\$[^ ]*\(:\)\@=" | highlight link subxLabel Constant

let &cpo = s:save_cpo