Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 51d4040 in mainline


Ignore:
Timestamp:
2009-09-16T23:22:20Z (11 years ago)
Author:
Martin Decky <martin@…>
Branches:
master
Children:
f1fb1d1
Parents:
cf7b3e0
Message:

add support for 'alternative' statement in BP
implement interface protocol repetition

Location:
contrib/arch
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • contrib/arch/hadlbppp.py

    rcf7b3e0 r51d4040  
    3535
    3636# TODO:
    37 #  - alternative token
    38 #  - iface protocol repetition
    3937#  - interface inheritance
    4038
     
    130128        return True
    131129
    132 def preproc_bp(name, tokens):
     130def tentative_bp(name, tokens):
    133131        "Preprocess tentative statements in Behavior Protocol"
    134132       
     
    153151                                if (level == 0):
    154152                                        result.append("(")
    155                                         result.extend(preproc_bp(name, tokens[start:(i - 1)]))
     153                                        result.extend(tentative_bp(name, tokens[start:(i - 1)]))
    156154                                        result.append(")")
    157155                                        result.append("+")
     
    162160                                        print "%s: Syntax error in tentative statement" % name
    163161                        else:
    164                                 print "%s: Unexpected token in tentative statement" % name
     162                                print "%s: Expected '{' for tentative statement" % name
    165163                else:
    166164                        result.append(tokens[i])
     
    170168        return result
    171169
     170def alternative_bp(name, tokens):
     171        "Preprocess alternative statements in Behavior Protocol"
     172       
     173        result = []
     174        i = 0
     175       
     176        while (i < len(tokens)):
     177                if (tokens[i] == "alternative"):
     178                        if ((i + 1 < len(tokens)) and (tokens[i + 1] == "(")):
     179                                i += 2
     180                                reps = []
     181                               
     182                                while ((i < len(tokens)) and (tokens[i] != ")")):
     183                                        reps.append(tokens[i])
     184                                        if ((i + 1 < len(tokens)) and (tokens[i + 1] == ";")):
     185                                                i += 2
     186                                        else:
     187                                                i += 1
     188                               
     189                                if (len(reps) >= 2):
     190                                        if ((i + 1 < len(tokens)) and (tokens[i + 1] == "{")):
     191                                                i += 2
     192                                               
     193                                                start = i
     194                                                level = 1
     195                                               
     196                                                while ((i < len(tokens)) and (level > 0)):
     197                                                        if (tokens[i] == "{"):
     198                                                                level += 1
     199                                                        elif (tokens[i] == "}"):
     200                                                                level -= 1
     201                                                       
     202                                                        i += 1
     203                                               
     204                                                if (level == 0):
     205                                                        first = True
     206                                                       
     207                                                        for rep in reps[1:]:
     208                                                                retokens = []
     209                                                                for token in tokens[start:(i - 1)]:
     210                                                                        parts = token.split(".")
     211                                                                        if ((len(parts) == 2) and (parts[0] == reps[0])):
     212                                                                                retokens.append("%s.%s" % (rep, parts[1]))
     213                                                                        else:
     214                                                                                retokens.append(token)
     215                                                               
     216                                                                if (first):
     217                                                                        first = False
     218                                                                else:
     219                                                                        result.append("+")
     220                                                               
     221                                                                result.append("(")
     222                                                                result.extend(alternative_bp(name, retokens))
     223                                                                result.append(")")
     224                                                       
     225                                                        if (i < len(tokens)):
     226                                                                result.append(tokens[i])
     227                                                else:
     228                                                        print "%s: Syntax error in alternative statement" % name
     229                                        else:
     230                                                print "%s: Expected '{' for alternative statement body" % name
     231                                else:
     232                                        print "%s: At least one pattern and one replacement required for alternative statement" % name
     233                        else:
     234                                print "%s: Expected '(' for alternative statement head" % name
     235                else:
     236                        result.append(tokens[i])
     237               
     238                i += 1
     239       
     240        return result
     241
    172242def split_bp(protocol):
    173243        "Convert Behavior Protocol to tokens"
     
    176246
    177247def extend_bp(name, tokens, iface):
    178         "Add interface to incoming messages"
    179        
    180         result = []
     248        "Convert interface Behavior Protocol to generic protocol"
     249       
     250        result = ["("]
    181251        i = 0
    182252       
     
    198268                i += 1
    199269       
     270        result.append(")")
     271        result.append("*")
     272       
    200273        return result
    201274
     
    227300        "Parse Behavior Protocol"
    228301       
    229         tokens = preproc_bp(name, tokens)
     302        tokens = tentative_bp(name, tokens)
     303        tokens = alternative_bp(name, tokens)
    230304       
    231305        indent = base_indent
  • contrib/arch/uspace/lib/libfs/fnc.libfs_lookup

    rcf7b3e0 r51d4040  
    11(
    2         alternative fs tmpfs fat devfs {
     2        alternative (fs; tmpfs; fat; devfs) {
    33                !fs.lookup
    44        }
  • contrib/arch/uspace/lib/libfs/fnc.libfs_mount

    rcf7b3e0 r51d4040  
    11?ipc_m_connection_clone ;
    22?ipc_m_data_write /* mount options */ {
    3         alternative fs tmpfs fat devfs {
     3        alternative (fs; tmpfs; fat; devfs) {
    44                !fs.ipc_m_connect_to_me ;
    55                !fs.mounted ;
  • contrib/arch/uspace/srv/vfs/vfs.bp

    rcf7b3e0 r51d4040  
    2121                                                (
    2222                                                        /* root fs */
    23                                                         alternative fs tmpfs fat devfs {
     23                                                        alternative (fs; tmpfs; fat; devfs) {
    2424                                                                !fs.mounted ;
    2525                                                                !fs.ipc_m_data_write /* mount options */
     
    2929                                                        /* non-root fs */
    3030                                                        tentative {
    31                                                                 alternative fs tmpfs fat devfs {
     31                                                                alternative (fs; tmpfs; fat; devfs) {
    3232                                                                        [fnc.vfs_lookup_internal] ;
    3333                                                                        tentative {
     
    5555                        ?ipc_m_data_write /* path */ ;
    5656                        tentative {
    57                                 alternative fs tmpfs fat devfs {
     57                                alternative (fs; tmpfs; fat; devfs) {
    5858                                        [fnc.vfs_lookup_internal] ;
    5959                                        tentative {
     
    6868       
    6969        ?open_node {
    70                 alternative fs tmpfs fat devfs {
     70                alternative (fs; tmpfs; fat; devfs) {
    7171                        [fnc.vfs_open_node_internal] ;
    7272                        tentative {
     
    8080        ?close {
    8181                tentative {
    82                         alternative fs tmpfs fat devfs {
     82                        alternative (fs; tmpfs; fat; devfs) {
    8383                                [fnc.vfs_grab_phone] ;
    8484                                !fs.close ;
     
    9191                tentative {
    9292                        ?ipc_m_data_read {
    93                                 alternative fs tmpfs fat devfs {
     93                                alternative (fs; tmpfs; fat; devfs) {
    9494                                        [fnc.vfs_grab_phone] ;
    9595                                        !fs.read ;
     
    104104                tentative {
    105105                        ?ipc_m_data_write {
    106                                 alternative fs tmpfs fat devfs {
     106                                alternative (fs; tmpfs; fat; devfs) {
    107107                                        [fnc.vfs_grab_phone] ;
    108108                                        !fs.write ;
     
    116116        ?truncate {
    117117                tentative {
    118                         alternative fs tmpfs fat devfs {
     118                        alternative (fs; tmpfs; fat; devfs) {
    119119                                [fnc.vfs_grab_phone] ;
    120120                                !fs.truncate ;
     
    127127                tentative {
    128128                        ?ipc_m_data_read /* struct stat */ {
    129                                 alternative fs tmpfs fat devfs {
     129                                alternative (fs; tmpfs; fat; devfs) {
    130130                                        [fnc.vfs_grab_phone] ;
    131131                                        !fs.stat ;
     
    141141                tentative {
    142142                        ?ipc_m_data_read /* struct stat */ {
    143                                 alternative fs tmpfs fat devfs {
     143                                alternative (fs; tmpfs; fat; devfs) {
    144144                                        [fnc.vfs_lookup_internal] ;
    145145                                        tentative {
     
    155155                ?ipc_m_data_write /* path */ ;
    156156                tentative {
    157                         alternative fs tmpfs fat devfs {
     157                        alternative (fs; tmpfs; fat; devfs) {
    158158                                [fnc.vfs_lookup_internal]
    159159                        }
     
    164164                ?ipc_m_data_write /* path */ ;
    165165                tentative {
    166                         alternative fs tmpfs fat devfs {
     166                        alternative (fs; tmpfs; fat; devfs) {
    167167                                [fnc.vfs_lookup_internal]
    168168                        }
     
    175175                        ?ipc_m_data_write /* new path */ ;
    176176                        tentative {
    177                                 alternative fs tmpfs fat devfs {
     177                                alternative (fs; tmpfs; fat; devfs) {
    178178                                        [fnc.vfs_lookup_internal] /* lookup old path */ ;
    179179                                        tentative {
     
    196196        ?sync {
    197197                tentative {
    198                         alternative fs tmpfs fat devfs {
     198                        alternative (fs; tmpfs; fat; devfs) {
    199199                                !fs.sync
    200200                        }
Note: See TracChangeset for help on using the changeset viewer.